1

几个 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

4 回答 4

3

你需要使用ereg吗?它已被弃用,自 PHP 6 起将被淘汰。我建议您使用 preg,它也更有效。

此信息可在 php.net/ereg 获得

于 2009-09-01T13:52:04.597 回答
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);'));
于 2009-09-01T13:55:14.357 回答
3

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

问题是你正在做:

foreach($arKeyword as $aWord) {

它从数组的第一个元素循环到最后一个元素,按照您声明它们的顺序针对每个关键字测试整个字符串。您首先声明了“Int”,因此在循环到达“Integer”关键字之前,字符串中的任何“Integer”都将被“<span class="ssKeyword">Int</span>eger”替换。到那时,如果有“</span>”的话,它就永远不会匹配了。

更改数组顺序,使较长的关键字排在最前面,它会起作用。

于 2009-09-01T14:10:06.803 回答
0

如果您正在进行纯文本匹配,那么str_replace效率更高且不必要。如果您将来确实需要正则表达式,请使用这些preg_*函数,因为ereg_*已弃用并且preg_*速度更快。

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

Hello World! Hello World!

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

/Hell(.+)rld!/

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

/Hell(.+?)rld!/
于 2009-09-01T14:22:51.120 回答