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()
现在也需要一个加载器作为其第一个参数。