PHP Smarty — получить список всех переменных в шаблоне?

Я использую 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}») и не включаю никаких других шаблонов.


person Rory    schedule 27.10.2009    source источник


Ответы (5)


Если вам нужны переменные, скрытые в таких вещах, как {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);
}
person Arkh    schedule 08.12.2009
comment
Следует отметить, что нецелесообразно анализировать html, smarty или любой другой исходный код с помощью регулярных выражений. Например, вы будете ложно ловить переменные, которые были закомментированы. Однако не все, что мы делаем, должно быть мудрым. - person enrey; 25.10.2013

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

person Rory    schedule 15.12.2009
comment
Из stackoverflow.com /questions/716916/ // Если параметр не указан, возвращается массив всех назначенных переменных. $all_tpl_vars = $smarty-›getTemplateVars(); - person Lexib0y; 10.11.2015

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

preg_match_all('\{\$(.*?)\}', $string, $matches, PREG_PATTERN_ORDER);
$variableNames = $matches[1];
person soulmerge    schedule 27.10.2009
comment
Примечания: (1) Переменные Smarty — это {$var}, а не ${var}. (2) $matches будет массивом массивов, поэтому вам придется перебирать $matches[0] для доступа к полным совпадениям. (3) Может быть проще захватить содержимое { и } с помощью круглых скобок, а затем получить к нему доступ с помощью $matches[1] вместо использования substr() для полных совпадений. - person Ferdinand Beyer; 27.10.2009
comment
Вы можете просто сделать $variableNames = $matches[1]; . Если вы хотите зациклить результат, как вы делаете, вам нужно использовать флаг PREG_SET_ORDER, я думаю. - person Tom Haigh; 27.10.2009
comment
@Tom: Спасибо, это был PREG_PATTERN_ORDER, и код сократился до двух строк. - person soulmerge; 27.10.2009
comment
PREG_PATTERN_ORDER используется по умолчанию, я имел в виду, что для работы вашего предыдущего примера вам нужно было указать PREG_SET_ORDER. Но PREG_PATTERN_ORDER здесь лучше - person Tom Haigh; 27.10.2009
comment
да, это то, что я думал сделать, я просто надеялся, что будет простой встроенный умный способ сделать это. - person Rory; 27.10.2009
comment
@Rory: smarty выполняет обработку в одной гигантской функции, поэтому код для сопоставления переменных не изолирован, а встроен в нее. Итак, я предполагаю, что функция, которую вы ищете, не существует. - person soulmerge; 27.10.2009

{debug}

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

person thomasrye    schedule 13.12.2013

Я думаю, что вы ищете консоль отладки .

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

person Arno    schedule 08.12.2009