PHP ereg_replace问题

时间:2009-09-01 13:47:02

标签: php regex posix-ere

一些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来发表评论。

4 个答案:

答案 0 :(得分:3)

你需要使用ereg吗?它已经被弃用,从PHP 6开始就会过时。我建议你使用preg,它也更有效。

此信息可在php.net/ereg

获取

答案 1 :(得分:3)

不是一次搜索一个词,而是一次更好地搜索所有词:

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

如果你按照它的长度对术语进行排序,你会发现 Integer 而不仅仅是 Int

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

答案 2 :(得分:3)

您的问题与ereg_replace无关。 preg_replace不仅是一个更好的选择,而且实际上在你的情况下你没有使用任何类型的正则表达式;你只是做一个简单的字符串匹配。所以str_replace会更快更清晰。

问题在于你在做什么:

foreach($arKeyword as $aWord) {

从数组的第一个元素循环到最后一个元素,按照您声明的顺序针对每个关键字测试整个字符串。您首先声明了'Int',因此在循环到'Integer'关键字之前,字符串中的任何'Integer'都会被“&lt; span class =”ssKeyword“&gt; Int&lt; / span&gt; eger”替换。在这种情况下,通过“&lt; / span&gt;”,它永远不会匹配。

更改数组顺序,以便更长的关键字排在第一位,然后才能正常工作。

答案 3 :(得分:0)

如果你正在进行纯文本匹配,那么str_replace会更有效率,更少没必要。如果您确实需要在将来的任何时间使用正则表达式,请使用preg_*函数,因为ereg_*已被弃用且preg_*更快。

关于你关于“贪婪”的问题,这指的是你实际使用正则表达式的时候。例如,如果你有文字:

Hello World! Hello World!

并使用这样的正则表达式:

/Hell(.+)rld!/

然后它将匹配整个字符串,因为+运算符是贪婪的并且在一行上找到尽可能多的字符串。你需要这样做才能阻止它贪婪并匹配每个短语:

/Hell(.+?)rld!/