PHP预匹配长度3276限制
PHP的PHP预匹配长度3276限制,php,preg-match,Php,Preg Match,PHP的preg_match在某些情况下对重复字符的匹配有3276个字符的限制 i、 e ^(.|\s){03276}$有效,但^(.|\s){03277}$无效 它似乎并不总是适用,因为/^(..{03277}$/是有效的 我在PHP的文档或bug跟踪器中都找不到这一点。3276这个数字似乎有点奇怪,我唯一能想到的是它大约是32767的1/10,这是有符号16位整数的极限 preg\u last\u error()返回0 我已经在我的本地系统和Web服务器上复制了这个问题 编辑:看起来我们从代
preg_match
在某些情况下对重复字符的匹配有3276个字符的限制
i、 e
^(.|\s){03276}$
有效,但^(.|\s){03277}$
无效
它似乎并不总是适用,因为/^(..{03277}$/
是有效的
我在PHP的文档或bug跟踪器中都找不到这一点。3276这个数字似乎有点奇怪,我唯一能想到的是它大约是32767的1/10,这是有符号16位整数的极限
preg\u last\u error()
返回0
我已经在我的本地系统和Web服务器上复制了这个问题
编辑:看起来我们从代码中得到了“警告:preg_match():编译失败:正则表达式在偏移量16处太大”,因此它似乎与相同的问题
然而,正则表达式本身并不是很大。。。当重复组太大时,PHP会进行某种扩展吗?尝试使用
^(.|\s){03276}(.|\s){0,1}$
为了处理与Perl兼容的正则表达式,PHP只需要绑定一个处理该作业的正则表达式。您描述的行为实际上是:
“*”量词等价于{0,},“+”量词等价于{1,}
,并将“?”量词改为{0,1}n和m仅限于
非负整数值小于在以下情况下定义的预设限值:
perl是构建的。在最常见的平台上通常是32766
所以总是有一个硬限制。为什么您的测试表明PHP限制比典型限制小10倍?不知道:)这很可能是一个内存边界,preg\u match将返回一个包含那么多元素的数组,因此您需要有足够的内存来容纳一个大数组,尝试提高最大内存限制,看看它是否更改。您是否检查了
preg\u last\u error()
?是否报告了错误?如果您使用了太多的memorypossible duplicate of(我怀疑这是您得到的错误,并且只是被抑制了),那么应该会有某种错误。preg_last_error()返回0,我将把它添加到帖子中。+1,因为这可能是问题所在。问题中的较小限制仅适用于组合
和\s
时,这种组合方式实际上保证产生大量回溯。如果我们猜测限制受到回溯(这是一个合理的猜测)的影响,那么如果限制降到这种水平,也就不足为奇了。