因为 php.ini 中 pcre.backtrack_limit 设置的问题,php 正则函数 preg_match_all 在本地与服务器的运行结果不一样。
今天发现在服务器上修改文章时,加入了一张图片,导致文章无法正常显示。查看到是将 base64 的图片传给服务器后,应用 preg_match_all 正则替换时,匹配给果为 0。
1 2 3 4 5 6 7 8
| $preg = '//is'; preg_match_all($preg, $content, $match); if (count($match[0]) > 0) {
}{
}
|
一直以为是$preg 写错了,后来一想,可能是本地的 win7 用 phpStudy 搭出的环境与正式阿里服务器不一样。
百度了一下 preg_match_all 本地与服务器 ,查看到 这里 的介绍:
如果 preg_match_all()
的返回结果是 0,则检测是否是配置问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| if ($resultsArray === 0){ echo get_pcre_err(); } function get_pcre_err(){ $pcre_err = preg_last_error(); if ($pcre_err === PREG_NO_ERROR) { $msg = 'Successful non-match.'; } else { switch ($pcre_err) { case PREG_INTERNAL_ERROR: $msg = 'PREG_INTERNAL_ERROR'; break; case PREG_BACKTRACK_LIMIT_ERROR: $msg = 'PREG_BACKTRACK_LIMIT_ERROR'; break; case PREG_RECURSION_LIMIT_ERROR: $msg = 'PREG_RECURSION_LIMIT_ERROR'; break; case PREG_BAD_UTF8_ERROR: $msg = 'PREG_BAD_UTF8_ERROR'; break; case PREG_BAD_UTF8_OFFSET_ERROR: $msg = 'PREG_BAD_UTF8_OFFSET_ERROR'; break; default: $msg = 'Unrecognized PREG error'; break; } } return($msg); }
|
果然返回结果是 PREG_BACKTRACK_LIMIT_ERROR
再百度了一下 PREG_BACKTRACK_LIMIT_ERROR
,找到 这一篇文章 提到,在 preg_match_all
的开头加入 ini_set("pcre.backtrack_limit",1000000);
提高最大回溯( pcre.backtrack_limit
)的递归限制,就可以了。