0

Twig テンプレートから必要な変数を見つける方法はありますか? 例、私が持っていた場合:

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

このテンプレートをロードして、必要な各変数を収集し、最終的に次のようなものを作成できます。

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

これの最終的な目標は、ビューを定義し、システムがテンプレート ファイル内の必要な変数に基づいてフォームを作成できるようにすることです。

4

4 に答える 4

2

ワーキングソリューション

以下を使用して必要なものを取得できたことを指摘してくれたmorgに感謝しtokenizeます(テストのためにコントローラーに配置しました):

$lexer = new \Twig_Lexer(new \Twig_Environment());
$stream = $lexer->tokenize(new \Twig_Source('{{test|raw}}{{test2|raw|asd}}{{another}}{{help_me}}', null));
$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();
        }
    }
}
$variables = array_unique($variables);

これは以下を返します:

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

変数と関数の両方を取得したい場合は、ネストされた while ループを削除できますが、変数のみを取得し、関数は取得していないことに気付くでしょう (これは設計によるものです)。

于 2013-01-14T10:29:59.683 に答える
1

これには twig トークナイザーを使用できます。

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

トークナイザーにはtoString()メソッドがあり、その結果の文字列を解析できます

VAR_START_TYPE()
NAME_TYPE(varname)
VAR_END_TYPE()

詳細については、これを参照してください

于 2013-01-12T14:24:32.120 に答える
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')
)
于 2013-01-11T16:21:02.730 に答える