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