php正则与服务器环境 php

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

关尔先生2017-12-11 20:13:00
今天发现在服务器上修改文章时,加入了一张图片,导致文章无法正常显示。查看到是将base64的图片传给服务器后,应用preg_match_all正则替换时,匹配给果为0。 ``` //$content是文章内容 $preg = '//is'; preg_match_all($preg, $content, $match); if (count($match[0]) > 0) { //匹配图片并保存 }{ //没有图片 } ``` 一直以为是$preg写错了,后来一想,可能是本地的win7用phpStudy搭出的环境与正式阿里服务器不一样。 百度了一下 **preg_match_all 本地与服务器** ,查看到 [这里](http://www.jb51.net/article/52849.htm) 的介绍: 如果 `preg_match_all()` 的返回结果是0,则检测是否是配置问题。 ``` 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` ,找到 [这一篇文章](http://blog.csdn.net/letianok/article/details/8720210) 提到,在 `preg_match_all` 的开头加入 `ini_set("pcre.backtrack_limit",1000000); ` 提高最大回溯(` pcre.backtrack_limit` )的递归限制,就可以了。

phppreg_match_allpcrebacktrack_limit

上一篇:送别江南●七律

下一篇:促拍满路花·词记九年

本文链接: http://www.nanshanqiao.com/zz_article/43.html

暂无评论