php新版本號廢棄 preg_replace /e 修飾符


近期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;  好了 今天先記錄到這里吧 。


小煙原創,轉載請注明出處!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM