看来 PHP 的preg_match
在某些情况下,匹配重复字符的字符数限制为 3276。
i.e.
^(.|\s){0,3276}$
有效,但是^(.|\s){0,3277}$
才不是。
它似乎并不总是适用,因为/^(.){0,3277}$/
works.
我在 PHP 文档或错误跟踪器中找不到任何提及的内容。数字 3276 似乎有点奇怪,我唯一能想到的是它大约是 32767 的 1/10,这是有符号 16 位整数的限制。
preg_last_error()
返回 0。
我已经重现了这个问题http://www.phpliveregex.com/ http://www.phpliveregex.com/以及我的本地系统和网络服务器。
编辑:看起来我们从代码中收到“警告:preg_match():编译失败:正则表达式在偏移量 16 处太大”,因此它似乎与PHP preg_match_all 限制 https://stackoverflow.com/questions/8268624/php-preg-match-all-limit.
然而,正则表达式本身并不是很大...当重复组使其太大时,PHP 是否会进行某种扩展?
为了处理 Perl 兼容的正则表达式,PHP 只是捆绑了一个第三方库 http://pcre.org/负责这项工作。您所描述的行为实际上是有记录的 http://perldoc.perl.org/perlre.html#Quantifiers:
“*”量词相当于 {0,} ,“+”量词相当于 {1,}
,和“?”量词为 {0,1} 。n 和 m 限于
非负整数值小于定义的预设限制
Perl 已构建。在最常见的平台上,这通常是 32766。
所以总是有一个硬性限制。为什么您的测试表明 PHP 限制比典型限制小 10 倍?对此一无所知:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)