我发现 JavaScript 和 PHP 处理以下正则表达式的方式之间存在差异,我感到很困惑。
在 JavaScript 中,
'foobar'.replace(/(?=(bar))/ , '$1');
'foobar'.replace(/(?=(bar))?/ , '$1');
'foobar'.replace(/(?:(?=(bar)))?/, '$1');
结果分别为
foobarbar
foobar
foobar
如这个jsFiddle所示。
然而,在 PHP 中,
echo preg_replace('/(?=(bar))/', '$1', "foobar<br/>");
echo preg_replace('/(?=(bar))?/', '$1', "foobar<br/>");
echo preg_replace('/(?:(?=(bar)))?/', '$1', "foobar<br/>");
结果是,
foobarbar
Warning: preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 9 in /homepages/26/d94605010/htdocs/lz/writecodeonline.com/php/index.php(201) : eval()'d code on line 2
foobarbar
我不太担心这个警告。但似乎在 JavaScript 中,前瞻断言在某种程度上比在 PHP 中“更懒惰”。为什么有区别?这是其中一个引擎中的错误吗?理论上哪个更“正确”?