5

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

4

3 回答 3

7

对于超过 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();
    }
于 2016-12-07T07:07:33.243 回答
0

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

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

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

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

似乎 (?R) 是一个实验设施。在这篇文章中:PHP,preg_replace 中的嵌套模板,有一个带有 (?R) 的正则表达式,详细解释了它,这使我找到了一个适用于更长字符串的解决方案:

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

希望能帮助到你。干杯

于 2015-02-07T23:45:04.030 回答
0

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

ini_set('pcre.backtrack_limit', 5000000);

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

于 2020-09-18T05:31:27.627 回答