2013-05-26 6 views
6

Можно ли получить все переменные, используемые в шаблоне веточки Например: На шаблонеПолучить все переменные, используемые в файле шаблон веточки

<!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') 

ее лучше, если кабина будет решена прут сама

+0

и почему 'item' не является переменной? – HamZa

+1

@HamZaDzCyberDeV Он используется внутри шаблона, но не является параметром шаблона. Тот, кто вызывает 'render ($ op_template)', не заботится о 'item'. – delnan

+0

@delnan Этот вопрос помечен как 'regex', regex не может найти/обнаружить такие вещи так логично, что вы не можете кодировать что-то универсальное, если хотите принять во внимание эти детали. Говоря о самом Twig, кажется, что он [невозможно] (http://stackoverflow.com/q/12799094/), поэтому нам, возможно, придется делать это с помощью регулярного выражения, но нам нужно указать «правила» на совпадение. – HamZa

ответ

20

Yo Dawg, я слышал, что вы, как Twig, так что я написал регулярное выражение S О, вы можете разобрать, пока вы разбираете:

регулярное выражение

\{\{(?!%)\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 demoPHP online demo

Примечание: Это просто POC и никогда не предназначены для использования на производстве.

+6

Мне жаль, что я не смог бы удвоить первую фразу) – zerkms

+3

+1 только для фразы, lol –

Смежные вопросы