Макроподстановка в PHP

Иногда требуется в строку с обычным текстом вставить какие то переменные, значения которых в данный момент неизвестны, а в последствии сделать макроподстановку значений.
Пример ниже демонстрирует поиск в тексте функций [{func_name(func_params)}] с помощью регулярного выражения. Найденные функции сверяются на допустимость с массивом $functions и запускаются, в соответствии с их названиями, каждой функции подставляются ее параметры в переменную $params. Вместо функций в тексте подстанавливается результат их выполнения.
<?php
//текст для макроподстановки
$subject = '{"logEntries":[],"value":"[{func1}]","text":"[{func2(0,5)}]","enabled":true}';
//массив допустимых функций
$functions['func1'] = true;
$functions['func2'] = true;
print("$subject<br />".strfparams($subject));
//функция делает макроподстановку
function strfparams($subject) {
//поиск функций
preg_match_all('/\[\{([A-Za-z][A-Za-z0-9_]*?)(?:|\((.*?)\))\}\]/m', $subject, $result, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result); $i++) {
$func_name = $result[1][$i];
$func_params = $result[2][$i];
// проверка на допустимость и запуск с параметрами
if (function_exists($func_name)) $func_result = $func_name($func_params);
$subject = str_replace($result[0][$i], $func_result, $subject);
}
return $subject;
}
function func1($params){
return 'result1';
}
function func2($params){
return 'result2:'.$params;
}
?>

В результате выполнения этого скрипта, на экране браузера мы увидим следущее:
{"logEntries":[],"value":"[{func1}]","text":"[{func2(0,5)}]","enabled":true}
{"logEntries":[],"value":"result1","text":"result2:0,5","enabled":true}

Метки:php-скрипт, regular expressions, макроподстановка, регулярные выражения
 

Комментарий

Нет пока комментариев.

Прокомментировать

 
(will not be published)
 
 
Сообщение