获取树枝模板文件中使用的所有变量[重复]
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')
最好用树枝自己解决
【问题讨论】:
@HamZaDzCyberDeV 在模板内部使用,但不是模板的参数。调用render($op_template)
的人并不关心item
。
@HamZaDzCyberDeV 你草率下结论。有regex
标签并不意味着解决方案必须基于有限自动机和有限自动机(顺便说一下,parsing
是另一个标签,它包含的内容足以解决这个问题)。
@HamZa DzCyberDeV & Anees v:可以通过实现自定义树枝节点访问者:github.com/fabpot/Twig/tree/master/lib/Twig/NodeVisitor
@HamZa DzCyberDeV:只要有如此出色的解析器可用,我就不会使用正则表达式 :-)
@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 只是为了这句话,哈哈以上是关于获取树枝模板文件中使用的所有变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章