Я пытаюсь сопоставить шаблон, который может быть вложенным.
Вот некоторые примеры данных, где я хочу извлечь содержимое внутри элемента {{ loop ... }
:
<ul>
{{ loop #users as #u }}
<li>{{ #u.first_name }} {{ #u.last_name }}</li>
{{ endloop }}
</ul>
Я правильно понял с этим RegEx:
/{{\s+loop\s+#([a-zA-Z_][a-zA-Z0-9_]*)((?:\.[a-zA-Z0-9_]+)*)\s+as\s+#([a-zA-Z_][a-zA-Z0-9_]*)\s+}}(.*){{\s+endloop\s+}}/sU
Пояснение:
/
{{
начало открытия петля элемент
\s+loop\s+
loop ключевое слово
#([a-zA-Z_][a-zA-Z0-9_]*)
имя переменной ( например: #var
)
((?:\.[a-zA-Z0-9_]+)*)
необязательный ключ переменной ( например: # var .key
)
\s+as\s+
как ключевое слово
#([a-zA-Z_][a-zA-Z0-9_]*)\s+
псевдоним переменной ( например: #alias
)
}}
конец разомкнутой петли элемент
(.*)
содержимое цикла
{{\s+endloop\s+}}
закрыть цикл элемент
/sU
Где это терпит неудачу
С помощью вложенных циклов мне нужно получить содержимое цикла первого уровня (потому что содержимое затем анализируется рекурсивно в моем проекте). Вот некоторые примеры данных:
1| <ul>
2| {{ loop #users as #u }}
3| <li>
4| {{ #u.first_name }} {{ #u.last_name }}
5| <ul>
6| {{ loop #u.friends as #f }}
7| <li>{{ #f.first_name }} {{ #f.last_name }}</li>
8| {{ endloop }}
9| </ul>
10| </li>
11| {{ endloop }}
12| </ul>
13|
14| {{ loop #foo as #bar }}
15| <a href="#">{{ #bar }}</a>
16| {{ endloop }}
С этим содержимым шаблон остановится на первом {{ endloop }}
(строки 2-8 ).
Если я уберу флаг U
(ungreedy), я не смогу использовать несколько циклов, так как они остановятся на последнем {{ endloop }}
, даже если это разные циклы (строки 2-16 ).
У меня была предыдущая версия шаблона с использованием флага /m
(многострочный), но он тоже не удался, поскольку он соответствовал только самому глубокому циклу уровня (строки 6-8 ).
У меня было много попыток (в основном, сделанных на regexr.com ), но я не видел никакого прогресса. Я искал решение о "рекурсивных шаблонах" , лучшее, что я нашел, было этот вопрос , но после многих попыток я не смог адаптировать его к своему проекту.
- Существует ли комбинация флагов / флагов, чтобы отдавать приоритет этому типу паттернов?
- Я немного читал о рекурсии в RegEx с
(?R)
, но не смог ее использовать, будет ли это полезно в моем случае?
- очевидный последний вопрос: как мне сопоставить все содержимое циклов первого уровня?
Я не только ищу решение, я был бы очень признателен, чтобы понять, как я могу решить это. Ссылка на текущий RegexR: regexr.com / 426fd