最近服务器PHP版本升级到了5.6发现出了很多警告。
preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead
一开始没注意,后来发现 很多这样的警告,于是网上查了下 发现 php5.5版本以上 就废弃了preg_replace函数中 /e 这个修饰符,这个修饰符的意思就是让正则替换的时候替换规则支持php代码。
那么,应该怎么办呢
其实,只要把preg_replace里面有/e修饰符的代码,修改成 preg_replace _callback 然后重新写下就好了。
举个例子
最简单的做法:
preg_replace(“/([A-Z])/e”, “‘_’ . strtolower(‘\\1’)”, $str);
修改成:
preg_replace(“/([A-Z])/”,’gwyy’, $str);
function gwyy($match) {
return ‘_’.strtolower($match[1]);
}
第二个参数是个函数名,然后在外部写一个函数,但是 我们每次定义一个函数感觉很麻烦,所以我们可以用匿名函数。
比如:
preg_replace(“/([A-Z])/e”, “‘_’ . strtolower(‘\\1’)”, $str)
修改成:
preg_replace_callback(‘/([A-Z])/’,
function ($matches) {
return ‘_’ . strtolower($matches[0]);
},
$str)
即可
这里特别警告:修改后/([A-Z])/e 最后一个e一定要去掉,不然就出错了。
如果在类里面还能这么写:
class a {
private $joinStr = “__AAAAA__”;
public function __construct() {
$this->joinStr = preg_replace_callback(“/__([A-Z_-]+)__/sU”,array($this,’gwyy’),$this->joinStr);
echo $this->joinStr;
}public function gwyy($match) {
print_r($match);
return ‘aaa’;
}}
$a = new a();
第二个参数不是一个函数,而变成了一个数组,表示 调用 $this 类 里面的 gwyy 方法 执行。gwyy会自动接受到 一个 $match 参数表。
下面再看一个稍微复杂点的例子。
$patterns = ‘/’.$begin.$parseTag.$n1.’\/(\s*?)’.$end.’/eis’;
$replacement = “\$this->parseXmlTag(‘$tagLib’,’$tag’,’$1′,”)”;
$content = preg_replace($patterns, $replacement,$content);
这个替换使用了类里面的自定义方法。如果你再用匿名函数直接套的话会提示错误。因为匿名函数上下文里面并没有该方法和该变量。所以,要用 use() 来引入;同时,注意 一定要把正则里面e去掉。
$that = $this;
$patterns = ‘/’.$begin.$parseTag.$n1.’\/(\s*?)’.$end.’/is’;
$content=preg_replace_callback($patterns, function($matches) use($tagLib,$tag,$that){
return $that->parseXmlTag($tagLib,$tag,$matches[1],”);
},$content);
这里用$that代替$this;
还有个简单粗暴的方法:
在服务器php.ini中设置
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
如果没有服务器的修改权限,则在报错的php页面头部加上
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
如果PHP还是显示报错,就用终级大招:
ini_set(‘display_errors’,0);
php.ini中只要display_errors = Off,错误信息就不会再页面上显示,因为display_errors的优先级别更高。
希望对各位做程序开发的朋友有所帮助。
评论