Php symfony中所需的细枝变量数组

Php symfony中所需的细枝变量数组,php,twig,symfony-2.1,Php,Twig,Symfony 2.1,是否有任何方法可以从细枝模板中发现所需的变量?例如,如果我有: Hello {{ user }}! You're {{ age }} years old, well done big man! 我将能够加载此模板,然后收集每个必需的变量,最终使我能够拥有如下内容: Array ( [0] => user [1] => age ) 它的最终目标是能够定义一个视图,然后让系统根据模板文件中所需的变量创建一个表单。您可以尝试使用preg\u match\u all(“{{\s*(\w+

是否有任何方法可以从细枝模板中发现所需的变量?例如,如果我有:

Hello {{ user }}! You're {{ age }} years old, well done big man!
我将能够加载此模板,然后收集每个必需的变量,最终使我能够拥有如下内容:

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

它的最终目标是能够定义一个视图,然后让系统根据模板文件中所需的变量创建一个表单。

您可以尝试使用
preg\u match\u all(“{{\s*(\w+\s*}”),“{{{var}}的模板{string},$matchesArray”)
$matchArray
的结构如下:

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

您可以尝试使用
preg_match_all({{\s*(\w+)\s*}}',模板{{{string}}}与{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()

查看以获取更详细的信息。

您可以为此使用细枝标记器

$stream = $twig->tokenize($source, $identifier);
标记器有一个
toString()
方法,您可以对其结果字符串进行解析

VAR_START_TYPE()
NAME_TYPE(varname)
VAR_END_TYPE()

查看了解更多详细信息。

工作解决方案

感谢morg为我指明了
tokenize
的方向,我能够使用以下工具获得我想要的东西(我将它放在我的控制器中进行测试):

这将返回:

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

您会注意到我只获取变量,而不获取任何函数(这是通过设计实现的),尽管如果您希望同时获取变量和函数,可以删除嵌套的while循环。

工作解决方案

感谢morg为我指明了
tokenize
的方向,我能够使用以下工具获得我想要的东西(我将它放在我的控制器中进行测试):

这将返回:

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

您会注意到我只获取变量,而不获取任何函数(这是通过设计实现的),尽管如果您希望同时获取变量和函数,可以删除嵌套的while循环。

从PHP代码内部执行此操作的另一种方法并不优雅,但仍然比任何正则表达式更可靠:

$source=“带有{{some}}参数的我的模板字符串。”;
$stream=$twig->tokenize(new\twig\u Source($Source,“Source”));
$matches=[];
预赛(
“/NAME\u TYPE\((.*)/”,$stream->\u toString(),$matches
);
如果(计数($matches)>1){
$params=array_unique($matches[1]);
}否则{
$params=[];
}
这是通过使用细枝内部机制来标记模板字符串,然后使用正则表达式提取参数名称来实现的


编辑:我的答案的前一个版本使用parse方法创建了一个节点树,但它似乎不再有效,在前一步匹配NAME_类型似乎更可靠,不确定我是否遗漏了什么…

从PHP代码内部执行此操作的另一种方法并不优雅,但比任何正则表达式更可靠的是:

$source=“带有{{some}}参数的我的模板字符串。”;
$stream=$twig->tokenize(new\twig\u Source($Source,“Source”));
$matches=[];
预赛(
“/NAME\u TYPE\((.*)/”,$stream->\u toString(),$matches
);
如果(计数($matches)>1){
$params=array_unique($matches[1]);
}否则{
$params=[];
}
这是通过使用细枝内部机制来标记模板字符串,然后使用正则表达式提取参数名称来实现的


编辑:我的答案的前一个版本使用解析方法来创建一个节点树,但是它似乎不再起作用,并且在前面的步骤上对NAMEYTYPE进行匹配似乎更可靠,不确定如果我在那里漏掉了什么……/P>我确实考虑过这一点,但是:A)它看起来有点笨拙。b) 它不会考虑像

{var|raw}
{var|customfunction(10)}}
这样的事情。我现在正在搜索twig,看看是否有一种方法我可以使用,或者在twig开发者文档中搜索,但没有找到任何东西。这个正则表达式可能工作得更好。我知道这可能不是最干净的方法,但到目前为止我看到的只有一个。我确实考虑过了,但是:A)看起来有点笨拙。b) 它不会考虑像
{var|raw}
{var|customfunction(10)}}
这样的事情。我现在正在搜索twig,看看是否有一种方法我可以使用,或者在twig开发者文档中搜索,但没有找到任何东西。这个正则表达式可能工作得更好。我知道这可能不是最干净的方式,但是目前为止我能看到的唯一一种。介意我问你为什么要这样吗?@PedroCordeiro它在我的最后一句话中是这么说的:)介意我问你为什么要这样吗?@PedroCordeiro它在我的最后一句话中是这么说的:)只是建议对Twig 2.x进行编辑,其中,
tokenize
需要一个
Twig\u源代码,而不接受字符串。注意
new\Twig\u Environment()
现在也需要一个加载器作为其第一个参数。刚刚建议对Twig 2.x进行编辑,其中
tokenize
需要一个
Twig\u源代码,而不接受字符串。注意
new\Twig\u Environment()
现在也需要一个加载器作为其第一个参数。