您好,登錄后才能下訂單哦!
升級了Mac新系統Yosemite,用著非常舒服,不過每次Mac系統更新,php和apache都要重新折騰一下,這次php的版本從5.4更新到5.5。。。
工作中對一些開源php軟件進行二次開發,升級以后軟件報錯:
preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead
在網上查找原因,函數preg_replace的“/e”修飾符在5.5的版本中已經被棄用,要使用preg_replace_callback() 代替。
“/e”
的作用官方說明如下:當使用被棄用的 e 修飾符時, 這個函數會轉義一些字符(即:'、"、 \ 和
NULL)然后進行后向引用替換。當這些完成后請確保后向引用解析完后沒有單引號或 雙引號引起的語法錯誤(比如:
'strlen(\'$1\')+strlen("$2")')。確保符合PHP的字符串語法,并且符合eval語法。因為在完成替換后,引擎會將結果字
符串作為php代碼使用eval方式進行評估并將返回值作為最終參與替換的字符串。
根據實際使用的情況我理解這個的作用是,使用preg_replace和修飾符以后,字符串被替換為包含了可執行的php代碼,
舉個栗子:
$html = "<h6>Hello World</h6>"; echo $html; echo preg_replace( '(<h([1-6])>(.*?)</h\1>)e', '"<h$1>" . strtoupper("$2") . "</h$1>"', $html );
字符被替換的同時也執行strtoupper函數。其實感覺這種用法怪怪的。。。
其實要我寫我會寫成
if(preg_match('(<h([1-6])>(.*?)</h\1>)', $html, $m)){
echo "<h{$m[1]}>" . strtoupper($m[2]) . "</h{$m[1]}>";
}
這樣更容易讀懂。。。
下面說說 preg_replace_callback,它替代了preg_replace的“/e”修飾符,不過用起來也很怪。。。
echo preg_replace_callback( '(<h([1-6])>(.*?)</h\1>)', function ($m) { return "<h$m[1]>" . strtoupper($m[2]) . "</h$m[1]>"; }, $html );
執行一個正則表達式搜索并且使用一個回調進行替換,其實和preg_match匹配有點像。
解釋完preg_replace_callback這個函數看看實際中解決問題。
以下代碼現在開源軟件的模板引擎好像很多都用到了,
preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);
改成
preg_replace_callback( "/{([^\}\{\n]*)}/", function ($m) { return $this->select($m[1]); }, $source );
下面這段數組替換沒想到更好的方法
$pattern = array( '/<!--[^>|\n]*?({.+?})[^<|{|\n]*?-->/', // 替換smarty注釋 '/<!--[^<|>|{|\n]*?-->/', // 替換不換行的html注釋 '/(href=["|\'])\.\.\/(.*?)(["|\'])/i', // 替換相對鏈接 '/((?:background|src)\s*=\s*["|\'])(?:\.\/|\.\.\/)?(p_w_picpaths\/.*?["|\'])/is', // 在p_w_picpaths前加上 $tmp_dir '/((?:background|background-p_w_picpath):\s*?url\()(?:\.\/|\.\.\/)?(p_w_picpaths\/)/is', // 在p_w_picpaths前加上 $tmp_dir '/{nocache}(.+?){\/nocache}/ise', //無緩存模塊 ); $replace = array( '\1', '', '\1\2\3', '\1' . $tmp_dir . '\2', '\1' . $tmp_dir . '\2', "'{insert name=\"nocache\" ' . '" . $this->_echash . "' . base64_encode('\\1') . '}'", ); preg_replace($pattern, $replace, $source);
只想到分步進行替換
$pattern = array( '/<!--[^>|\n]*?({.+?})[^<|{|\n]*?-->/', // 替換smarty注釋 '/<!--[^<|>|{|\n]*?-->/', // 替換不換行的html注釋 '/(href=["|\'])\.\.\/(.*?)(["|\'])/i', // 替換相對鏈接 '/((?:background|src)\s*=\s*["|\'])(?:\.\/|\.\.\/)?(p_w_picpaths\/.*?["|\'])/is', // 在p_w_picpaths前加上 $tmp_dir '/((?:background|background-p_w_picpath):\s*?url\()(?:\.\/|\.\.\/)?(p_w_picpaths\/)/is', // 在p_w_picpaths前加上 $tmp_dir // '/{nocache}(.+?){\/nocache}/ise', //無緩存模塊 ); $replace = array( '\1', '', '\1\2\3', '\1' . $tmp_dir . '\2', '\1' . $tmp_dir . '\2', // "'{insert name=\"nocache\" ' . '" . $this->_echash . "' . base64_encode('\\1') . '}'", ); // preg_replace($pattern, $replace, $source); ###php5.5 preg_replace 不能使用 \e 參數 $source = preg_replace($pattern, $replace, $source); preg_replace_callback( '/{nocache}(.+?){\/nocache}/is', function ($m) { return '{insert name=\"nocache\" ' .$this->_echash . base64_encode($m[1]) . '}'; }, $source ); }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。