【发布时间】:2013-07-29 14:05:44
【问题描述】:
似乎 PHP 的 preg_match 在某些情况下匹配重复字符有 3276 个字符的限制。
即
^(.|\s){0,3276}$ 有效,但 ^(.|\s){0,3277}$ 无效。
它似乎并不总是适用,因为 /^(.){0,3277}$/ 有效。
我在 PHP 的文档或错误跟踪器中的任何地方都找不到提到的内容。数字 3276 似乎有点奇怪,我唯一能想到的是它大约是 32767 的 1/10,这是有符号 16 位整数的限制。
preg_last_error() 返回 0。
我已经在http://www.phpliveregex.com/ 以及我的本地系统和网络服务器上重现了这个问题。
编辑:看起来我们从代码中得到了“警告:preg_match():编译失败:正则表达式在偏移量 16 处太大”,因此它似乎与 PHP preg_match_all limit 存在相同的问题。
但是,正则表达式本身并不是很大...当您有重复的组使其变得太大时,PHP 是否会进行某种扩展?
【问题讨论】:
-
它更可能是内存边界,preg_match 将返回一个包含这么多元素的数组,所以你需要有足够的内存来容纳一个大数组,尝试提高你的最大内存限制,看看是否它改变了。
-
你检查
preg_last_error()了吗? -
您的错误报告在吗?如果你使用太多内存应该会有某种错误
-
PHP preg_match_all limit 的可能重复项(我怀疑这是您遇到的错误,只是被压制了)。
-
preg_last_error() 返回 0,我将其添加到帖子中。
标签: php preg-match