Можно ли получить все переменные, используемые в шаблоне ветви. Например: по шаблону
<!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')
Лучше всего, если он будет разрешен самой веточкой
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 онлайн-демонстрация PHP-демо-версии
Примечание. Это просто ПОС и никогда не предназначено для использования на производстве.