获取树枝模板文件中使用的所有变量[重复]

Posted

技术标签:

【中文标题】获取树枝模板文件中使用的所有变量[重复]【英文标题】:Get all variables used in a twig template file [duplicate] 【发布时间】:2013-05-21 09:56:12 【问题描述】:

是否可以获取树枝模板中使用的所有变量 例如:在模板上

<!DOCTYPE html>
<html>
    <head>
        <title>My Webpage</title>
    </head>
    <body>
        <ul id="navigation">
        % for item in navigation %
            <li><a href=" item.href "> item.caption </a></li>
        % endfor %
        </ul>

        <h1>My Webpage</h1>
         a_variable 
    </body>
</html>

现在我需要将上面使用的所有变量作为数组获取

Array(1=>'navigation',2=>'a_variable')

最好用树枝自己解决

【问题讨论】:

@HamZaDzCyber​​DeV 在模板内部使用,但不是模板的参数。调用render($op_template) 的人并不关心item @HamZaDzCyber​​DeV 你草率下结论。有regex 标签并不意味着解决方案必须基于有限自动机和有限自动机(顺便说一下,parsing 是另一个标签,它包含的内容足以解决这个问题)。 @HamZa DzCyber​​DeV & Anees v:可以通过实现自定义树枝节点访问者:github.com/fabpot/Twig/tree/master/lib/Twig/NodeVisitor @HamZa DzCyber​​DeV:只要有如此出色的解析器可用,我就不会使用正则表达式 :-) @Anees v:我认为这是唯一的twig.sensiolabs.org/doc/internals.html 但如果您了解解析器的一般实现方式,这没什么大不了的 【参考方案1】:

Yo dawg,听说你喜欢 Twig,所以我写了一个正则表达式,这样你就可以在解析时进行解析:

正则表达式

\\(?!%)\s* # Starts with  not followed by % followed by 0 or more spaces
      ((?:(?!\.)[^\s])*) # Match anything without a point or space in it
\s*(?<!%)\\ # Ends with 0 or more spaces not followed by % ending with 
| # Or
\%\s* # Starts with % followed by 0 or more spaces
      (?:\s(?!endfor)(\w+))+ # Match the last word which can not be endfor
\s*%\ # Ends with 0 or more spaces followed by %
# Flags: i: case insensitive matching | x: Turn on free-spacing mode to ignore whitespace between regex tokens, and allow # comments.

PHP

$string = '<!DOCTYPE html>
<html>
    <head>
        <title>My Webpage</title>
    </head>
    <body>
        <ul id="navigation">
        % for item in navigation %
            <li><a href=" item.href "> item.caption </a></li>
        % endfor %
        </ul>

        <h1>My Webpage</h1>
         a_variable 
    </body>
</html>';

preg_match_all('/\\(?!%)\s*((?:(?!\.)[^\s])*)\s*(?<!%)\\|\%\s*(?:\s(?!endfor)(\w+))+\s*%\/i', $string, $m);
$m = array_map('array_filter', $m); // Remove empty values
array_shift($m); // Remove first index [0]
print_r($m); // Print results

Regex online demo PHP online demo

注意:这只是一个POC,绝不能用于生产。

【讨论】:

我希望我可以为第一句话投两次票) +1 只是为了这句话,哈哈

以上是关于获取树枝模板文件中使用的所有变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在grav中选择我的树枝模板中的所有标签?

我无法在 drupal 9 的树枝模板中获取值

从类型树枝模板中的 FormType 访问变量

Symfony 异常,使用控制器和树枝模板的数据库查询

如何从 symfony 中删除树枝? [关闭]

PHP将html放在树枝变量中?