2013-01-11 53 views
0

如果有任何方法可以發現樹枝模板所需的變量嗎?舉例來說,如果我有:symfony中所需的樹枝變量數組

Hello {{ user }}! You're {{ age }} years old, well done big man! 

我能夠加載這個模板,然後收集所需的每一個變量,最終讓我有類似:

Array ([0] => user [1] => age) 

的最終目標這是爲了能夠定義一個視圖,然後讓系統根據模板文件中所需的變量創建一個表單。

+0

請記住,如果我問你爲什麼要這樣做? –

+0

@PedroCordeiro它在我的最後一句話中是這麼說的:) – Prisoner

回答

1

工作液

感謝MORG指着我對tokenize我能得到我想要使用下面的(我把它放在我的控制器用於測試):

$lexer = new \Twig_Lexer(new \Twig_Environment()); 
$stream = $lexer->tokenize('{{test|raw}}{{test2|raw|asd}}{{another}}{{help_me}}'); 
$variables = array(); 
while (!$stream->isEOF()) { 
    $token = $stream->next(); 
    if($token->getType() === \Twig_Token::NAME_TYPE){ 
     $variables[] = $token->getValue(); 
     while (!$stream->isEOF() && $token->getType() !== \Twig_Token::VAR_END_TYPE) { 
      $token = $stream->next(); 
     } 
    } 
} 

這返回:

Array 
(
    [0] => test 
    [1] => test2 
    [2] => another 
    [3] => help_me 
) 

你會注意到我只獲取變量而不是任何函數(這是通過gh設計),儘管如果你想獲得變量和函數,你可以刪除嵌套的while循環。

0

您可以嘗試使用preg_match_all('{{\s*(\w+)\s*}}', 'template {{string }} with {{ var}}', $matchesArray);$matchArray的結構如下:

Array(
    0 => array(0 => '{{string }}', 1 => 'string'), 
    1 => array(0 => '{{ var}}', 1 => 'var') 
) 
+0

我確實考慮過這個問題,但是:a)它看起來有點冒險。 b)它不會考慮諸如'{{var | raw}}或'{{var | customfunction(10)}}'之類的東西。我正在通過樹枝搜索,看看我能夠使用或適應的方法 – Prisoner

+0

在twig developer doc中搜索並沒有發現任何東西。這個正則表達式可能會更好地運行'#{{\ s *(\ w +)。* \ s *}}#U'。我知道這可能不是最乾淨的方式,但是迄今爲止我只能看到。 – martinqt

1

您可以使用樹枝標記器爲此。

$stream = $twig->tokenize($source, $identifier); 

標記生成器有一個toString()方法,其得到的字符串可以解析爲

VAR_START_TYPE() 
NAME_TYPE(varname) 
VAR_END_TYPE() 

this更詳細的信息。