【问题标题】:PHP preg_match length 3276 limitPHP preg_match 长度 3276 限制
【发布时间】:2013-07-29 14:05:44
【问题描述】:

似乎 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 是否会进行某种扩展?

【问题讨论】:

  • 它更可能是内存边界,preg_match 将返回一个包含这么多元素的数组,所以你需要有足够的内存来容纳一个大数组,尝试提高你的最大内存限制,看看是否它改变了。
  • 你检查preg_last_error()了吗?
  • 您的错误报告在吗?如果你使用太多内存应该会有某种错误
  • PHP preg_match_all limit 的可能重复项(我怀疑这是您遇到的错误,只是被压制了)。
  • preg_last_error() 返回 0,我将其添加到帖子中。

标签: php preg-match


【解决方案1】:

为了处理与 Perl 兼容的正则表达式,PHP 只是捆绑了一个 third-party library 来处理这项工作。你描述的行为其实是documented

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

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

【讨论】:

  • +1 因为这可能是问题所在。问题中看到的较小限制仅适用于以几乎可以保证产生大量回溯的方式组合 .\s 时。如果我们猜测限制受到回溯的影响(这是一个合理的猜测),那么限制降到这种水平也就不足为奇了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2010-12-06
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多