PHP preg_match长度为3276限制

时间:2013-07-29 14:05:44

标签: php preg-match

似乎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会做某种扩展吗?

2 个答案:

答案 0 :(得分:1)

为了处理与Perl兼容的正则表达式,PHP只捆绑了负责这项工作的third-party library。您描述的行为实际上是documented

  

“*”量词相当于{0,},“+”量词相当于{1,}   ,和“?”量词到{0,1}。 n和m仅限于   非负整数值小于当定义的预设限制   构建了perl。在最常见的平台上通常是32766。

所以总有一个硬限制。为什么你的测试表明PHP限制比典型的小10倍?不知道这个:))

答案 1 :(得分:0)

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