php5.5preg_replace_callback函数-创新互联

升级了Mac新系统Yosemite,用着非常舒服,不过每次Mac系统更新,php和apache都要重新折腾一下,这次php的版本从5.4更新到5.5。。。

工作中对一些开源php软件进行二次开发,升级以后软件报错:

preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead

在网上查找原因,函数preg_replace的“/e”修饰符在5.5的版本中已经被弃用,要使用preg_replace_callback() 代替。

“/e” 的作用官方说明如下:当使用被弃用的 e 修饰符时, 这个函数会转义一些字符(即:'、"、 \ 和 NULL)然后进行后向引用替换。当这些完成后请确保后向引用解析完后没有单引号或 双引号引起的语法错误(比如: 'strlen(\'$1\')+strlen("$2")')。确保符合PHP的字符串语法,并且符合eval语法。因为在完成替换后,引擎会将结果字 符串作为php代码使用eval方式进行评估并将返回值作为最终参与替换的字符串。

根据实际使用的情况我理解这个的作用是,使用preg_replace和修饰符以后,字符串被替换为包含了可执行的php代码,

举个栗子:

成都创新互联是一家成都网站设计、成都做网站,提供网页设计,网站设计,网站制作,建网站,按需开发网站,网站开发公司,于2013年创立是互联行业建设者,服务者。以提升客户品牌价值为核心业务,全程参与项目的网站策划设计制作,前端开发,后台程序制作以及后期项目运营并提出专业建议和思路。$html = "
Hello World
"; echo $html; echo preg_replace(     '((.*?))e',     '"" . strtoupper("$2") . ""',     $html );

字符被替换的同时也执行strtoupper函数。其实感觉这种用法怪怪的。。。

其实要我写我会写成

if(preg_match('((.*?))', $html, $m)){

    echo "" . strtoupper($m[2]) . "";

}

这样更容易读懂。。。

下面说说 preg_replace_callback,它替代了preg_replace的“/e”修饰符,不过用起来也很怪。。。

echo preg_replace_callback(     '((.*?))',     function ($m) {         return "" . strtoupper($m[2]) . "";     },     $html );

执行一个正则表达式搜索并且使用一个回调进行替换,其实和preg_match匹配有点像。

解释完preg_replace_callback这个函数看看实际中解决问题。

以下代码现在开源软件的模板引擎好像很多都用到了,

preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);

改成

preg_replace_callback(                 "/{([^\}\{\n]*)}/",                 function ($m) {                     return $this->select($m[1]);             },             $source         );

下面这段数组替换没想到更好的方法

$pattern = array(     '//', // 替换smarty注释     '//',               // 替换不换行的html注释     '/(href=["|\'])\.\.\/(.*?)(["|\'])/i',  // 替换相对链接     '/((?:background|src)\s*=\s*["|\'])(?:\.\/|\.\.\/)?(p_w_picpaths\/.*?["|\'])/is', // 在p_w_picpaths前加上 $tmp_dir     '/((?:background|background-p_w_picpath):\s*?url\()(?:\.\/|\.\.\/)?(p_w_picpaths\/)/is', // 在p_w_picpaths前加上 $tmp_dir     '/{nocache}(.+?){\/nocache}/ise', //无缓存模块     ); $replace = array(     '\1',     '',     '\1\2\3',     '\1' . $tmp_dir . '\2',     '\1' . $tmp_dir . '\2',                "'{insert name=\"nocache\" ' . '" . $this->_echash . "' . base64_encode('\\1') . '}'",     ); preg_replace($pattern, $replace, $source);

只想到分步进行替换

      $pattern = array(             '//', // 替换smarty注释             '//',               // 替换不换行的html注释             '/(href=["|\'])\.\.\/(.*?)(["|\'])/i',  // 替换相对链接             '/((?:background|src)\s*=\s*["|\'])(?:\.\/|\.\.\/)?(p_w_picpaths\/.*?["|\'])/is', // 在p_w_picpaths前加上 $tmp_dir             '/((?:background|background-p_w_picpath):\s*?url\()(?:\.\/|\.\.\/)?(p_w_picpaths\/)/is', // 在p_w_picpaths前加上 $tmp_dir //             '/{nocache}(.+?){\/nocache}/ise', //无缓存模块             );         $replace = array(             '\1',             '',             '\1\2\3',             '\1' . $tmp_dir . '\2',             '\1' . $tmp_dir . '\2', //             "'{insert name=\"nocache\" ' . '" . $this->_echash . "' . base64_encode('\\1') . '}'",             );            //      preg_replace($pattern, $replace, $source);            ###php5.5 preg_replace 不能使用 \e 参数         $source = preg_replace($pattern, $replace, $source);                    preg_replace_callback(                 '/{nocache}(.+?){\/nocache}/is',                 function ($m) {                     return '{insert name=\"nocache\" ' .$this->_echash . base64_encode($m[1]) . '}';                 },                 $source         );     }

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文标题:php5.5preg_replace_callback函数-创新互联
文章起源:http://ybzwz.com/article/icggd.html