近期serverphp版本號升級到了 5.6 發現出了非常多警告
preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead
一開始沒注意。后來發現 非常多這種警告,於是網上查了下 發現 php5.5版本號以上 就廢棄了 preg_replace 函數中 /e 這個修飾符 /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; 好了 今天先記錄到這里吧 。
小煙原創,轉載請注明出處!