PHP Smarty - 获取模板中所有变量的列表?

时间:2009-10-27 09:43:51

标签: php templates smarty template-engine

我正在使用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" );

我想要这样做的原因是因为我希望用户能够自己输入模板,然后在以后填写它们。因此,我需要能够获得此模板中的变量列表。

让我们假设我只做简单的变量(例如:no“{$ object.method}”或“{$ varaible | function}”),而且我不包括任何其他模板。

5 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:3)

看起来没有一种内置的方法可以做到这一点。

答案 2 :(得分:2)

通常我反对正则表达式,但这看起来像是一个有效的案例。您可以使用preg_match_all()来执行此操作(如果您只需要${this}之类的变量):

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

答案 3 :(得分:1)

{debug}

我意识到这个线程已经过时了,但这是内置的解决方案。

答案 4 :(得分:0)

我认为你要找的是debugging console

此控制台会显示网页中涉及的模板中使用的所有变量。