真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

php5.5preg_replace_callback函數(shù)

升級(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('((.*?))', $html, $m)){

    echo "" . strtoupper($m[2]) . "";

}

這樣更容易讀懂。。。

下面說(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
        );
    }

當(dāng)前文章:php5.5preg_replace_callback函數(shù)
網(wǎng)站網(wǎng)址:http://weahome.cn/article/jgjpgg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部