每天学习一点点,成功增加一大步

php7中对preg_replace内的e不再支持

PHP zhanghui 134℃

背景

最近想升级 PKCMS 系统,直接用的之前的代码,将系统适配到 PHP7,之前适配的是 PHP 5.3~5.6,然后一顿操作,发现打开后成一片空白,傻眼了,开始从系统底层检查,最后发现是模板引擎中的模板标签语法解析出了问题。这段解析来自 PHPCMS 的底层。

$str = preg_replace("/\<{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}>/es", "tplTag_Addquote('<?php if(isset(\\1)) {echo \\1;}?>')", $str);

这条命令的结果居然是空,百度发现问题在preg_replace 的/e这里。

解决方案

说一下解决方案,因为不再支持了所以需要使用替代方法,改用preg_replace_callback替换就好。

$str = preg_replace_callback(
            "/\<{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}>/s",
            function ($r) {
                return self::tplTag_Addquote('<?php if(isset(' . $r[1] . ')) {echo ' . $r[1] . ';} ?>');
            },
            $str
        );

转载请注明:隨習筆記 » php7中对preg_replace内的e不再支持

喜欢 (0)