2009-09-01 39 views
1

一些PHP ereg_replace問題。我有名字的數組:PHP ereg_replace問題

$ssKeywords = array("Str", "Int", "String", "As", "Integer", "Variant"); 

然而,當我使用這個ereg_replace:

foreach($arKeyword as $aWord) { 
    $sCode = ereg_replace($aWord, "<span class='ssKeyword'>".$aWord."</span>", $sCode); 
} 

它只會找到「STR」或「INT」不是完整的比賽。顯然ereg_replace是貪婪的,爲什麼它不尋找完整的匹配?

我設法使用preg_replace來獲取註釋。

回答

3

你需要使用ereg嗎?它已被棄用,並將從PHP 6過時。我建議你使用preg,這也更有效。

此信息,請php.net/ereg

+0

使用此功能只會導致錯誤。 –

+0

存在的錯誤的意義是固定的,不要被使用不同的功能遺忘;) – bezmax

+0

嗯,我的評論工作!現在只是關鍵字。 –

3

而不是在一個時間尋找一個長期在同一時間爲所有的人更好的搜索:

$sCode = preg_replace('/(?:'.implode('|', array_map('preg_quote', $ssKeywords)).')/', '<span class="ssKeyword">$0</span>', $sCode); 

如果你的條件進行排序它的長度,你會發現整數,而不是僅僅詮釋

usort($ssKeywords, create_function('$a,$b', 'return strlen($b)-strlen($a);')); 
+0

排序部分工作,但實際替換沒有。 –

+0

啊,不要着急,我仍然有foreach循環中的代碼。 –

3

你的問題與ereg_replace無關。 preg_replace不僅是一個更好的選擇,而且事實上在你的情況下你不使用任何類型的正則表達式;你只是在做一個簡單的字符串匹配。所以str_replace會更快,更清晰。

的問題是,你正在做的:

foreach($arKeyword as $aWord) { 

,從第一循環到陣列的最後一個元素,測試對每個關鍵詞的整串的順序,你聲明它們。您首先聲明瞭'Int',因此在循環獲得「Integer」關鍵字之前,字符串中的任何'Integer'都將被替換爲「< span class =」ssKeyword「> Int </span> eger」。到那個時候,在「</span>」的方式,它永遠不會匹配。

更改數組順序,以便更長的關鍵字先來,它會工作。

+0

這是一個好主意。可惜我可以在JavaScript中正常工作。不管怎麼說,還是要謝謝你! –

+0

不區分大小寫? –

+0

str_ireplace,可能。雖然如果你需要不區分大小寫但保留,是的,preg_replace可能是更簡單的路線。 – bobince

0

如果您正在進行純文本匹配,那麼str_replace效率更高,而且不必要。如果您將來需要使用正則表達式,請使用preg_*函數,因爲ereg_*已棄用,而preg_*會更快。

關於您關於「貪婪」的問題,指的是您實際使用正則表達式時的情況。例如,如果您有文字:

Hello World! Hello World! 

,並使用正則表達式是這樣的:

/Hell(.+)rld!/ 

然後,它會因爲+運算符是貪婪和發現一樣,因爲它可以對整個字符串匹配一條線。你需要做到這一點,以防止它被貪婪,並匹配每一個短語:

/Hell(.+?)rld!/