2009-10-27 7 views
2

Я использую Smarty и PHP. Если у меня есть шаблон (либо как файл, либо как строка), есть ли какой-то способ получить smarty для синтаксического анализа этого файла/строки и вернуть массив со всеми переменными smarty в этом шаблоне?PHP Smarty - получить список всех переменных в шаблоне?

т.д .: Я хочу что-то вроде этого:

$mystring = "Hello {$name}. How are you on this fine {$dayofweek} morning"; 
$vars = $smarty->magically_parse($string); 
// $vars should now be array("name", "dayofweek"); 

Поэтому я хочу, чтобы сделать это, потому что я хочу, чтобы пользователи могли вводить сами шаблоны, а затем заполнить их на более поздний срок. Следовательно, мне нужно иметь возможность получить список переменных, которые находятся в этих шаблонах.

Предположим, что я выполняю простые переменные (например: no "{$ object.method}" или "{$ varaible | function}") и что я не включаю никаких других шаблонов.

+0

http://stackoverflow.com/questions/716916/print-all-variables-available-in-a-smarty-template – Lexib0y

ответ

3

Похоже, что нет встроенного способа сделать это.

+0

От http: // stackoverflow.com/questions/716916/print-all-variables-available-in-a-smarty-template // Если параметр не задан, возвращается массив всех назначенных переменных. $ all_tpl_vars = $ smarty-> getTemplateVars(); – Lexib0y

2

Обычно я против регулярных выражений, но для меня это выглядит как действительный случай. Вы можете использовать preg_match_all(), чтобы сделать это (Если вы хотите только переменные, как):

preg_match_all('\{\$(.*?)\}', $string, $matches, PREG_PATTERN_ORDER); 
$variableNames = $matches[1]; 
+2

Примечания: (1) Переменные Smarty: {$ var}, а не $ {var}. (2) '$ matches' будет массивом массивов, поэтому вам нужно будет перебирать' $ matches [0] 'для доступа к полным совпадениям. (3) Возможно, было бы легче захватить содержимое '{' и '}', используя parantheses, затем обращаясь к нему с помощью '$ matches [1]' вместо использования 'substr()' в полных совпадениях. –

+0

@Ferdinand: Thx, обновленный ответ. – soulmerge

+0

Вы можете просто выполнить $ variableNames = $ matches [1]; , Если вы хотите перебрать результат, как вы делаете, вам нужно использовать флаг PREG_SET_ORDER, я думаю. –

0

Я думаю, что вы ищете, debugging console.

Эта консоль показывает все переменные, используемые в шаблонах, используемых на вашей веб-странице.

4

Если вам нужно переменные, спрятанные вещи, как {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); 
} 
+0

Следует отметить, что неразумно «разбирать» html, smarty или любой другой исходный код, если это имеет значение, с регулярными выражениями. Вы ошибочно поймаете переменные, которые были достойны, например. Однако не все, что мы делаем, должно быть разумным. – enrey

1
{debug} 

Я понимаю, что эта ветка устарела, но это встроенное решение.

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