php正则与服务器环境 前端

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

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

  1. //$content是文章内容
  2. $preg = '/<img(.*?)>/is';
  3. preg_match_all($preg, $content, $match);
  4. if (count($match[0]) > 0) {
  5. //匹配图片并保存
  6. }{
  7. //没有图片
  8. }

        一直以为是$preg写错了,后来一想,可能是本地的win7用phpStudy搭出的环境与正式阿里服务器不一样。
百度了一下【preg_match_all 本地与服务器】,查看到http://www.jb51.net/article/52849.htm 这里的介绍:
如果 preg_match_all()的返回结果是0,则检测是否是配置问题。

  1. if ($resultsArray === 0){
  2. echo get_pcre_err();
  3. }
  4. function get_pcre_err(){
  5.         $pcre_err = preg_last_error();  // PHP 5.2 and above.
  6.         if ($pcre_err === PREG_NO_ERROR) {
  7.             $msg = 'Successful non-match.';
  8.         } else {
  9.             // preg_match error!
  10.             switch ($pcre_err) {
  11.                 case PREG_INTERNAL_ERROR:
  12.                     $msg = 'PREG_INTERNAL_ERROR';
  13.                     break;
  14.                 case PREG_BACKTRACK_LIMIT_ERROR:
  15.                     $msg = 'PREG_BACKTRACK_LIMIT_ERROR';
  16.                     break;
  17.                 case PREG_RECURSION_LIMIT_ERROR:
  18.                     $msg = 'PREG_RECURSION_LIMIT_ERROR';
  19.                     break;
  20.                 case PREG_BAD_UTF8_ERROR:
  21.                     $msg = 'PREG_BAD_UTF8_ERROR';
  22.                     break;
  23.                 case PREG_BAD_UTF8_OFFSET_ERROR:
  24.                     $msg = 'PREG_BAD_UTF8_OFFSET_ERROR';
  25.                     break;
  26.                 default:
  27.                     $msg = 'Unrecognized PREG error';
  28.                     break;
  29.             }
  30.         }
  31.     return($msg);
  32. }

      果然返回结果是 【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://nanshanqiao.com/zz_article/43.html

暂无评论