Intereting Posts
php: mcrypt_encrypt to openssl_encrypt и проблемы с OPENSSL_ZERO_PADDING PHP: Как использовать set_error_handler () для правильной обработки всех ошибок, кроме уведомлений? Недопустимая аббревиатура сокращенного времени DST для Австралии при использовании date_default_timezone_set Попытка получить общую сумму на основе ввода пользователем Автоматическое форматирование файла PHP в emacs создать новый объект в php Symfony2: прерывистое высокое время отклика / медленное завершение SessionHandlerProxy :: read () PHP Недопустимый тип смещения Разбор RSS-ленты с использованием PHP для вставки в мой SQL-запрос Требуется расширение Laravel 4 – Mcrypt PHP: данные двоичного изображения, проверка типа изображения Как обнаружить откат в хранимой процедуре MySQL? Рекурсивный вызов до тех пор, пока значение не будет больше ответа Создайте уникальный уникальный токен csrf в Symfony Учебник / рекомендация клиента PHP SOAP?

Получить все переменные, используемые в файле шаблона twig

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

<!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-демо-версии

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