【问题标题】:Maximum length for a string for preg_replace() in PHP?PHP中preg_replace()的字符串的最大长度?
【发布时间】:2012-08-02 03:16:17
【问题描述】:

我发现如果我尝试对一个很长的字符串使用 preg_replace,PHP 会向我的浏览器返回一个空页面,而不会显示错误消息。我能够在我的测试环境中重现这个错误。 preg_replace 可以处理的字符串的最大长度是多少?可以增加这个长度吗?

【问题讨论】:

  • "我能够在我的测试环境中重现这个错误" --- 在此处显示脚本
  • 我使用的是从这里下载的函数:nadeausoftware.com/articles/2007/9/…我记得之前我使用正则表达式从HTML文件中提取数据时出现过这个问题,所以不是正则表达式的问题。
  • 那么现在的问题是什么?
  • 问题是为什么 preg_replace 是否有最大长度。如果不是,为什么它会杀死我的脚本?
  • 完成。 15 个字符。

标签: php regex


【解决方案1】:

对于超过 4M 的 $pattern 匹配字符串,我也遇到了同样的情况。 可能您将不得不使用 ini_set() 或编辑 php.ini 来增加 pcre.backtrack_limit

检查 preg 是否有最后一个错误:

    $retval = preg_replace ($pattern, $replacement, $subject);
    if ($retval === null) {
      // see http://php.net/manual/en/function.preg-last-error.php
      echo preg_last_error();
    }

【讨论】:

  • 谢谢!这是解决此问题的一种正确方法
【解决方案2】:

我也遇到了这个问题,使用这个正则表达式(我在不记得的地方找到了它):

'~\[quote(?:=([^\]]+))?\]((?:(?R)|.)*?)\[/quote\]~s'

这用于替换嵌套的引号 BBcode,使用 (?R) 递归模式修饰符。

当引号之间的字符串接近 300 个字符(确实很少)时,我的浏览器中会出现“重置连接”。 Apache 或 PHP 的错误日志中没有任何内容(我正在运行 Wampserver 2.4 和 PHP 5.4.16)。

似乎 (?R) 是一个experimental facility。 在这篇文章中:PHP, nested templates in preg_replace,有一个带有 (?R) 的正则表达式进行了详细解释,这使我找到了一个适用于更长字符串的解决方案:

'%\[quote(?:=([^\]]+))?\]((?:[^[]*(?:\[(?!/?quote(?:=[^\]]+)?\])[^[]*)*|(?R))*)\[/quote\]%x'

希望对您有所帮助。 干杯

【讨论】:

    【解决方案3】:

    pcre.backtrack_limit 的默认值为 1000000。如果您的字符串长度高于该值,您可以通过将其添加到脚本的开头轻松解决它:

    ini_set('pcre.backtrack_limit', 5000000);
    

    在上面的代码中,字符串的最大长度已经设置为5000000。根据自己的需要调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2013-04-12
      • 2016-05-03
      • 2013-12-24
      相关资源
      最近更新 更多