2016-04-27 209 views
0

你能幫我爲下面的行創建preg_replace_callbacks嗎?我可以效仿的榜樣,如果有人可以創建1個或2回調...需要幫助來創建preg_replace_callback

$output = file_get_contents(vBSEO_Storage::path('html') . '/' . $tplname . '.html'); 
$output = preg_replace('#\{path:(\w+)\}#ei', 'vBSEO_Storage::path("$1")', $output); 
$output = preg_replace('#\{opt:(\w+)\[(.*?)\]\}#ei', 'htmlspecialchars(vBSEO_Storage::setting("$1","$2"))', $output); 
$output = preg_replace('#\{opt:(\w+)\}#ei', 'vBSEO_Storage::setting("$1")', $output); 
$output = preg_replace('#\{lang_esc:([\w\_]+)\}#ei', 'addslashes(vBSEO_CP::lang("$1"))', $output); 
$output = preg_replace('#\{lang:([\w\_]+)\}#ei', 'vBSEO_CP::lang("$1")', $output); 
$output = preg_replace('#\{var_esc:([\w\_]+)\}#ei', 'htmlspecialchars(\$vars["$1"])', $output); 
$output = preg_replace('#\{var:([\w\_]+)\}#ei', '\$vars["$1"]', $output); 
return $output; 

回答

0

你可以很容易找到,如何preg_replace_callback作品:

$output = '/{path:application}/sub_path/to/folder/filename.html'; 
$output = preg_replace_callback(
    '#\{path:(\w+)\}#i', 
    function($match) 
    { return '(' . join(')(', $match) . ')'; 
    }, 
    $output 
); 
echo $output; 

// output: /({path:application})(application)/sub_path/to/folder/filename.html 

的參數給回調函數是一個數組(每個呼叫一個出現)匹配的模式。既然你可以在大括號中指定子模式,那麼該數組在字段0中保存整個匹配的字符串,而字段1在第一個大括號中保存子模式。您從回調中返回所需的替代品。

嘗試:

$output = preg_replace_callback(
    '#\{path:(\w+)\}#i', 
    function($match) 
    { return vBSEO_Storage::path($match[1]); 
    }, 
    $output 
); 
0

閱讀本http://php.net/manual/en/function.preg-replace-callback.php

例如,你的第一個preg_replace函數可以用preg_replace_callback這樣寫:

$output = preg_replace_callback('#\{path:(\w+)\}#ei', function($match) { 
    // $match[0] is the entire match 
    // $match[1] is $1, etc 
    return 'vBSEO_Storage::path("'. $match[1] .'")'; 
}, $output); 

但是,如果preg_replace足夠,您爲什麼要使用preg_replace_callback?

+0

對於PHP 7的兼容性。/e已被棄用。謝謝回覆!我正在嘗試使用/ e修飾符修復preg_replace的所有實例。 –