升級(jí)了Mac新系統(tǒng)Yosemite,用著非常舒服,不過(guò)每次Mac系統(tǒng)更新,php和apache都要重新折騰一下,這次php的版本從5.4更新到5.5。。。
工作中對(duì)一些開(kāi)源php軟件進(jìn)行二次開(kāi)發(fā),升級(jí)以后軟件報(bào)錯(cuò):
preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead
在網(wǎng)上查找原因,函數(shù)preg_replace的“/e”修飾符在5.5的版本中已經(jīng)被棄用,要使用preg_replace_callback() 代替。
“/e”
的作用官方說(shuō)明如下:當(dāng)使用被棄用的 e 修飾符時(shí), 這個(gè)函數(shù)會(huì)轉(zhuǎn)義一些字符(即:'、"、 \ 和
NULL)然后進(jìn)行后向引用替換。當(dāng)這些完成后請(qǐng)確保后向引用解析完后沒(méi)有單引號(hào)或 雙引號(hào)引起的語(yǔ)法錯(cuò)誤(比如:
'strlen(\'$1\')+strlen("$2")')。確保符合PHP的字符串語(yǔ)法,并且符合eval語(yǔ)法。因?yàn)樵谕瓿商鎿Q后,引擎會(huì)將結(jié)果字
符串作為php代碼使用eval方式進(jìn)行評(píng)估并將返回值作為最終參與替換的字符串。
根據(jù)實(shí)際使用的情況我理解這個(gè)的作用是,使用preg_replace和修飾符以后,字符串被替換為包含了可執(zhí)行的php代碼,
舉個(gè)栗子:
創(chuàng)新互聯(lián)專(zhuān)注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都做網(wǎng)站、橋東網(wǎng)絡(luò)推廣、小程序開(kāi)發(fā)、橋東網(wǎng)絡(luò)營(yíng)銷(xiāo)、橋東企業(yè)策劃、橋東品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供橋東建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
$html = "Hello World
"; echo $html; echo preg_replace( '((.*?) )e', '"" . strtoupper("$2") . " "', $html );
字符被替換的同時(shí)也執(zhí)行strtoupper函數(shù)。其實(shí)感覺(jué)這種用法怪怪的。。。
其實(shí)要我寫(xiě)我會(huì)寫(xiě)成
if(preg_match('(
echo "
}
這樣更容易讀懂。。。
下面說(shuō)說(shuō) preg_replace_callback,它替代了preg_replace的“/e”修飾符,不過(guò)用起來(lái)也很怪。。。
echo preg_replace_callback( '((.*?) )', function ($m) { return "" . strtoupper($m[2]) . " "; }, $html );
執(zhí)行一個(gè)正則表達(dá)式搜索并且使用一個(gè)回調(diào)進(jìn)行替換,其實(shí)和preg_match匹配有點(diǎn)像。
解釋完preg_replace_callback這個(gè)函數(shù)看看實(shí)際中解決問(wèn)題。
以下代碼現(xiàn)在開(kāi)源軟件的模板引擎好像很多都用到了,
preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);
改成
preg_replace_callback( "/{([^\}\{\n]*)}/", function ($m) { return $this->select($m[1]); }, $source );
下面這段數(shù)組替換沒(méi)想到更好的方法
$pattern = array( '//', // 替換smarty注釋 '//', // 替換不換行的html注釋 '/(href=["|\'])\.\.\/(.*?)(["|\'])/i', // 替換相對(duì)鏈接 '/((?: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', //無(wú)緩存模塊 ); $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);
只想到分步進(jìn)行替換
$pattern = array( '//', // 替換smarty注釋 '//', // 替換不換行的html注釋 '/(href=["|\'])\.\.\/(.*?)(["|\'])/i', // 替換相對(duì)鏈接 '/((?: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', //無(wú)緩存模塊 ); $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 參數(shù) $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 ); }