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