Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP预匹配长度3276限制_Php_Preg Match - Fatal编程技术网

PHP预匹配长度3276限制

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服务器上复制了这个问题 编辑:看起来我们从代

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():编译失败:正则表达式在偏移量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
时,这种组合方式实际上保证产生大量回溯。如果我们猜测限制受到回溯(这是一个合理的猜测)的影响,那么如果限制降到这种水平,也就不足为奇了。