7

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

IE

^(.|\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 限制相同。

但是,正则表达式本身并不是很大...当您有重复组使其太大时,PHP 是否会进行某种扩展?

4

2 回答 2

1

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

"*" 量词等同于 {0,} ,"+" 量词等同于 {1,} 和 "?" {0,1} 的量词。n 和 m 被限制为小于构建 perl 时定义的预设限制的非负整数值。在最常见的平台上,这通常是 32766。

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

于 2013-08-01T11:14:11.093 回答
0

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

于 2013-08-01T10:07:53.257 回答