php - JavaScript 和 PHP 之间前瞻断言的惰性差异

标签 php javascript regex lookahead

我对 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 中更“懒惰”。为什么不同?这是其中一个引擎中的错误吗?理论上哪个更“正确”?

最佳答案

真正的区别其实很简单:

在 JavaScript 中,replace 只会替换第一个匹配项,除非使用 /g 标志(全局)。
在 PHP 中,preg_replace 替换所有匹配项。

第三个模式(?:(?=(bar)))?可以匹配每个位置的空串,捕获"bar"在< em>一些职位。如果没有 /g 标志,它只会在字符串的开头匹配一次。

如果您使用更明显的替换字符串,例如 [$1],您会很容易看出差异。

PHP 示例:http://ideone.com/8Mjg6
JavaScript 示例,无 /g:http://jsfiddle.net/qKb4b/3/
JavaScript 示例,带有 /g:http://jsfiddle.net/qKb4b/2/

我还会注意到 "laziness"是正则表达式中的不同概念,与本题无关。

关于php - JavaScript 和 PHP 之间前瞻断言的惰性差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12435954/

相关文章:

javascript - 如何用javascript初始化php变量?

regex - R 中的计数模式匹配

具有依赖注入(inject)的 PHPUnit,使用 instanceof() 测试模拟对象

php - jQuery.validator.addMethod 检查用户名

php - Facebook api 和 codeigniter

javascript - AngularJS Controller 中的函数

javascript - 'await' 对此表达式的类型没有影响

javascript - 需要进行哪些更改才能使 a.b.c() 的输出为 "I should be ' this'"

php - 正则表达式获取双花括号内的值 "{{ }}"

java - 定位非法状态异常错误