因为 php.ini 中 pcre.backtrack_limit 设置的问题,php 正则函数 preg_match_all 在本地与服务器的运行结果不一样。

今天发现在服务器上修改文章时,加入了一张图片,导致文章无法正常显示。查看到是将 base64 的图片传给服务器后,应用 preg_match_all 正则替换时,匹配给果为 0。

1
2
3
4
5
6
7
8
//$content是文章内容
$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(); // PHP 5.2 and above.
if ($pcre_err === PREG_NO_ERROR) {
$msg = 'Successful non-match.';
} else {
// preg_match error!
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 )的递归限制,就可以了。


编辑文章✏