Нужна помощь для создания preg_replace_callback
Не могли бы вы помочь мне создать preg_replace_callbacks для строк ниже? Я могу последовать примеру, если кто-то может создать 1 или 2 обратных вызовов...
$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;
2 ответа
Вы можете легко узнать, как работает 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
);
Прочитайте это 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 достаточно?