標籤:content 應該 方法 網上 修飾符 nts 5.5 int text
近期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;}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);
這裡 用 $that 取代 $this; 好了 今天先記錄到這裡吧 。
小煙原創,轉載請註明出處!
php新版本號碼廢棄 preg_replace /e 修飾符