最近伺服器php版本升級到了 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;}publicfunction 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);
這裡 用 $thit 代替 $this; 好了 今天先記錄到這裡吧 。
小煙原創,轉載請註明出處!
以上就介紹了php新版本廢棄 preg_replace /e 修飾符,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。