PHP Smarty - получить список всех переменных в шаблоне?
-
06-07-2019 - |
Вопрос
Я использую Smarty и PHP. Если у меня есть шаблон (в виде файла или в виде строки), есть ли какой-нибудь способ получить smarty для анализа этого файла / строки и возврата массива со всеми переменными smarty в этом шаблоне?
Например: я хочу что-то вроде этого:
$mystring = "Hello {$name}. How are you on this fine {$dayofweek} morning";
$vars = $smarty->magically_parse( $string );
// $vars should now be array( "name", "dayofweek" );
Причина, по которой я хочу это сделать, заключается в том, что я хочу, чтобы пользователи могли сами вводить шаблоны, а затем заполнять их позже. Следовательно, мне нужно иметь возможность получить список переменных, которые есть в этом шаблоне.
Давайте предположим, что я делаю только простые переменные (например, нет " {$ object.method} "или" {$ varaible | function} ") и что я не включаю никакие другие шаблоны . р>
Решение 2
Похоже, что нет встроенного способа сделать это.
Другие советы
Если вам нужны переменные, скрытые в таких вещах, как {if $ var% 2}
, я бы пошел с таким кодом:
preg_match_all('`{[^\\$]*\\$([a-zA-Z0-9]+)[^\\}]*}`', $string, $result);
$vars = $result[1];
Если вы также хотите отлавливать такие вещи: {if $ var! = $ var2}
следует лучшая версия
function getSmartyVars($string){
// regexp
$fullPattern = '`{[^\\$]*\\$([a-zA-Z0-9]+)[^\\}]*}`';
$separateVars = '`[^\\$]*\\$([a-zA-Z0-9]+)`';
$smartyVars = array();
// We start by extracting all the {} with var embedded
if(!preg_match_all($fullPattern, $string, $results)){
return $smartyVars;
}
// Then we extract all smarty variables
foreach($results[0] AS $result){
if(preg_match_all($separateVars, $result, $matches)){
$smartyVars = array_merge($smartyVars, $matches[1]);
}
}
return array_unique($smartyVars);
}
Обычно я против регулярных выражений, но для меня это выглядит как верный случай. Вы можете использовать preg_match_all ()
сделать это (если вам нужны только переменные типа $ {this}
):
preg_match_all('\{\$(.*?)\}', $string, $matches, PREG_PATTERN_ORDER);
$variableNames = $matches[1];
{debug}
Я понимаю, что эта тема старая, но это встроенное решение.