我发现如果我尝试在一个非常长的字符串上使用preg_replace函数,PHP会返回一个空白页面而不显示错误信息。我能够在测试环境中重现这个bug。preg_replace可以处理的字符串最大长度是多少?是否有可能增加这个长度?
我发现如果我尝试在一个非常长的字符串上使用preg_replace函数,PHP会返回一个空白页面而不显示错误信息。我能够在测试环境中重现这个bug。preg_replace可以处理的字符串最大长度是多少?是否有可能增加这个长度?
当我在匹配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();
}
我也遇到了这个问题,使用了这个正则表达式(我在某个地方找到的,不记得是哪里了):
'~\[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'
希望能有所帮助。 祝好。
pcre.backtrack_limit 的默认值为 1000000。如果您的字符串长度超过该值,您可以通过在脚本开头添加以下内容来轻松解决:
ini_set('pcre.backtrack_limit', 5000000);