Регулярное выражение для парсинга параметров в тексте
В текст статьи есть возможность вставлять коды следующего вида
#FUNC:PARAM1;PARAM2#
Здесь FUNC - имя функции, а PARAM_N - параметр. Сейчас такие вставки определяются при помощи следующей конструкции:
preg_replace_callback(
[
"/#FUNC1#/is"
"/#FUNC2:([\d]+);([\d]+)#/is"
],
...
)
Но это неудобно. Какие-то функции могут быть без параметров, какие-то - иметь любое количество параметров, и не только целочисленных. Подскажите, если есть, регулярное выражение, которое охватит сразу все варианты:
- Функции без параметров.
- Функции со строковыми параметрами, разделенными символом ";".
- Любое количество параметров.
- Любое имя функции.
Ответы (1 шт):
Вы про что-то такое? Ищите регулярками все конструкции между ##. Вычленяете имя функции и строку параметров целиком. Параметры разделяете по разделителю уже в колбэке. Вызываеет искомую функцию, если таковая имеется, с переданными аргументами.
$txt = "qweqweqwe #xxx:1;qwe# adadasdsd #yyy#";
$res = preg_replace_callback("/#(?<func>\w+)(:(?<params>.*?))?#/", function($m){
if(function_exists($m['func'])) {
$params = explode(';', $m['params'] ?? "");
return call_user_func_array($m[1], $params) ;
}
throw new \Exception("{$m[func]} does not exists");
}, $txt);
echo $res;
function xxx($a,$b){ return "$a-$b"; }
function yyy(){ return 'zzz'; }
зы: имена функций таки лучше проверять по какому-то белому списку,а то так и до #unlink:/www/.../....# недалеко.