我知道正则表达式引擎移动得更快,而无需跟踪反向引用。我也知道我可以在括号内部的开头添加?:
,以防止正则表达式引擎执行反向引用。
然而,无论如何我可以反转行为,使得不匹配成为默认行为?(而不是像U
标志)
答案 0 :(得分:4)
简答:不。
PHP使用PCRE库来解析正则表达式。
PCRE使用基于NFA的解析器来跟踪反向引用。您所描述的是基于DFA的解析器或Thompson NFA。
我不是PHP开发人员,但PCRE库确实带有“DFA模式”。大多数Linux发行版都会配备“pcretest”。如果你没有它,它会附带PCRE库。
在CLI中:
$ pcretest
re> /(foo)\1/
data> foofoo
0: foofoo
1: foo
现在,如果我们使用“-dfa”标志运行它:
$ pcretest -dfa
re> /(foo)\1/
data> foofoo
Error -16
您可能还想查看“占有量词”以防止回溯。
答案 1 :(得分:1)
您可以尝试使用PHP PECL RE2 http://pecl.php.net/package/re2