2016-04-27 2 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 поднабора в первых скобках. Вы возвращаетесь с обратного вызова на желаемую замену.

Try:

$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_callback, если preg_replace достаточно?

+0

Для PHP 7 совместимости./e устарела. Спасибо за ответ! Я пытаюсь исправить все экземпляры preg_replace с помощью/e modifier. –

Смежные вопросы