2011-04-16 192 views
0

我對PHP比較新,希望有人可以幫我替換正則表達式,或者可能替換一個匹配,我並不確定。Preg替換 - 替換第二次匹配

我想自動加粗(第二次出現匹配),然後使第4次出現匹配斜體,然後第7次出現匹配下劃線。

這基本上是針對內容搜索引擎優化的目的。

我已經做了一些替換:並認爲這應該做的伎倆?

preg_replace(pattern, replacement, subject [, limit ]) 

我已經知道我想在

'pattern' is also a word that is already defined like [word]. 
`replacement` 'This is a variable I am getting from a mysql db. 
'subject' - The subject is text from a db. 

使用可以說我有這個內容的一句話:這說明或多或少是我想做的事情。

這是我想替換的文本的一個例子。在本文中,我想使第二個出現的單詞示例 <加粗。然後我想跳過下一次在文本中發生的示例,並使第4次單詞例如以斜體顯示。然後我想跳過文本中第5次出現的單詞示例以及第6次,最後希望在文本中出現的第7次example加下劃線。在這個例子中,我使用超鏈接作爲下劃線示例,因爲我在文本編輯器中看不到下劃線功能。文字中的例子可能會出現更多次,但我唯一的要求是一次強調,一次大膽,一次斜體。我稍後可能會對「示例」這個詞做一些引用,但它還不是優先考慮的事情。

如果沒有至少7個單詞出現,代碼不要通過錯誤也很重要。

我該如何做到這一點,任何想法將不勝感激。

回答

3

你可以使用preg_split分裂在匹配的文本,應用修改,然後把所有的東西重新走到一起:

$parts = preg_split('/(example)/', $str, 7, PREG_SPLIT_DELIM_CAPTURE); 
if (isset($parts[3])) $parts[3] = '<b>'.$parts[3].'</b>'; 
if (isset($parts[7])) $parts[7] = '<i>'.$parts[7].'</i>'; 
if (isset($parts[13])) $parts[13] = '<u>'.$parts[13].'</u>'; 
$str = implode('', $parts); 

指標式爲第i個匹配指數 = ·2 - 1.

+0

非常感謝Gumbo!我幾乎可以開始直接向你發送我的所有問題:-)大多數情況下,你是那個有效的答案!太感謝了。 – 2011-04-16 18:23:31

+0

嗨,現在我很困惑。我已使用此頁面上的代碼http://24hour-casino-games.com/casino-reviews/online/casino_may_flower.asp h1不是字符串的一部分。所以如果我算上「五月花賭場」的話。第2場可能會開花賭場得到突出顯示,這是正確的。然後第四次使用它是斜體 - 這是正確的。然後如果我在$ str之後創建值,則7(14)將在第7個位置顯示另一個粗體,這是正確的。你可以向我解釋$ parts [7]在位置4和$ 7在位置7顯示...謝謝 – 2011-04-16 19:20:57

+1

@Gerald Ferreira:當'preg_split'捕獲分隔符(模式匹配)時,結果總是奇數個零件,其中奇數索引(因爲基於零)的每個偶數部分都是分隔符。所以第一個分隔符是1,第二個是3,第三個是5,等等。這可以用* i *·2 - 1來表示。 – Gumbo 2011-04-16 19:26:54

3

正則表達式本身不能計數,而preg_函數提供的幫助不大。你需要一個解決方法。如果您實際上只搜索一個詞,您可能需要使用字符串函數。否則請嘗試:

// just counting 
if (7 >= preg_match_all($pattern, $subject, $matches)) { 

    $cb_num = 0; 
    $subject = preg_replace_callback($pattern, "cb_ibu", $subject); 
} 

function cb_ibu($match) { 
    global $cb_num; 

    $match = $match[0]; 

    switch (++$cb_num) { 
     case 2: return "<b>$match</b>"; 
     case 4: return "<i>$match</i>"; 
     case 7: return "<u>$match</u>"; 
     default: return $match; 
    } 
} 

訣竅是有一個回調做會計。在那裏添加任何規則都很容易。

+0

感謝馬里奧,我現在正在檢查這個...只是爲了確保 – 2011-04-16 15:36:20

+0

$ pattern ='/ \ [word \] /'$ subject =?,$ matches =?我不確定要在主題和匹配項中輸入什麼...... – 2011-04-16 15:36:50

+0

'$ matches'只是一個未使用的一次性變量。但'$ subject'是你的源文本。 – mario 2011-04-16 15:38:21

0

這是一個有趣的問題。我的實現將是:

function replace_exact($word, $tag, $string, $limit) { 
    $tag1 = '<'.$tag.'>'; 
    $tag2 = '</'.$tag.'>'; 
    $string = str_replace($word, $tag1.$word.$tag2, $string, 1); 
    if ($limit==1) return $string; 
    return str_replace($tag1.$word.$tag2,$word,$string,$limit-1); 
} 

使用方法如下:

echo replace_exact('Example', 'b', $source_text, 2); 
echo replace_exact('Example', 'i', $source_text, 4); 

我不知道有多快的工作,但它會比preg_replace函數快。