在某些情况下,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}$