PHP中preg_replace()函数中字符串的最大长度是多少?

5

我发现如果我尝试在一个非常长的字符串上使用preg_replace函数,PHP会返回一个空白页面而不显示错误信息。我能够在测试环境中重现这个bug。preg_replace可以处理的字符串最大长度是多少?是否有可能增加这个长度?


我能够在我的测试环境中重现这个错误。 - zerkms
我正在使用从这里下载的函数:http://nadeausoftware.com/articles/2007/9/php_tip_how_strip_punctuation_characters_web_page 我记得以前在从HTML文件中提取数据时使用正则表达式时也出现过这个问题,所以这不是正则表达式的问题。 - Leo Jiang
那么现在的问题是什么呢? - zerkms
问题是preg_replace是否有最大长度限制。如果没有,为什么它会导致我的脚本崩溃? - Leo Jiang
请问你能否取消我的答案,这样我就可以将其删除。 - zerkms
1
完成。 - Leo Jiang
3个回答

7

当我在匹配4M以上的字符串时,也遇到了同样的问题。可能需要使用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();
    }

谢谢!这是解决这个问题的正确方式之一。 - 1111161171159459134

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'

希望能有所帮助。 祝好。


0

pcre.backtrack_limit 的默认值为 1000000。如果您的字符串长度超过该值,您可以通过在脚本开头添加以下内容来轻松解决:

ini_set('pcre.backtrack_limit', 5000000);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接