友荐云推荐

最近服务器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的优先级别更高。

希望对各位做程序开发的朋友有所帮助。