PHP preg_match长度限制为3276


PHP preg_match length 3276 limit

在某些情况下,PHP的preg_match似乎有3276个字符的限制来匹配重复字符。

^(.|'s){0,3276}$有效,但^(.|'s){0,3277}$无效。

它似乎并不总是适用,因为/^(.){0,3277}$/是有效的。

我在PHP文档或bug跟踪器中找不到提到的内容。数字3276看起来有点奇怪,我唯一能想到的是它大约是32767的1/10,这是有符号16位整数的极限。

preg_last_error()返回0。

我在上转载了这个问题http://www.phpliveregex.com/以及我的本地系统和Web服务器。

编辑:看起来我们在代码中得到了"警告:preg_match():编译失败:正则表达式在偏移量16处太大",所以这似乎与PHP preg_match_all限制是相同的问题。

然而,正则表达式本身并不是很大。。。当你有重复的组使PHP变得太大时,PHP会进行某种扩展吗?

为了处理与Perl兼容的正则表达式,PHP只捆绑了一个负责处理这项工作的第三方库。你描述的行为实际上是有记录的:

"*"量词等效于{0,},"+"量词等价于{1,},并且"?"量词为{0,1}n和m被限制为当perl已经构建完成在最常见的平台上,这通常是32766。

所以总有一个严格的限制。为什么你的测试表明PHP的限制比典型的限制小10倍?对此一无所知:)

尝试使用^(.|'s){0,3276}(.|'s){0,1}$