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