如果有任何方法可以發現樹枝模板所需的變量嗎?舉例來說,如果我有:symfony中所需的樹枝變量數組
Hello {{ user }}! You're {{ age }} years old, well done big man!
我能夠加載這個模板,然後收集所需的每一個變量,最終讓我有類似:
Array ([0] => user [1] => age)
的最終目標這是爲了能夠定義一個視圖,然後讓系統根據模板文件中所需的變量創建一個表單。
如果有任何方法可以發現樹枝模板所需的變量嗎?舉例來說,如果我有:symfony中所需的樹枝變量數組
Hello {{ user }}! You're {{ age }} years old, well done big man!
我能夠加載這個模板,然後收集所需的每一個變量,最終讓我有類似:
Array ([0] => user [1] => age)
的最終目標這是爲了能夠定義一個視圖,然後讓系統根據模板文件中所需的變量創建一個表單。
工作液
感謝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循環。
您可以嘗試使用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')
)
您可以使用樹枝標記器爲此。
$stream = $twig->tokenize($source, $identifier);
標記生成器有一個toString()
方法,其得到的字符串可以解析爲
VAR_START_TYPE()
NAME_TYPE(varname)
VAR_END_TYPE()
看this更詳細的信息。
請記住,如果我問你爲什麼要這樣做? –
@PedroCordeiro它在我的最後一句話中是這麼說的:) – Prisoner