Название, вероятно, сбивает с толку, но я понятия не имею, как правильно сформулировать это.
Так вот моя цель. У меня есть эта строка (или что-то подобное):
[some_element]Random string chars [some_element]Ramdon[/some_element] some more random chars[/some_element]
(Некоторые из вас могут признать, что это шорткоды WordPress, но эта методология будет полезна и для меня).
Что мне нужно сделать, это сопоставить родительский «элемент». Мой обычный подход может быть что-то вроде этого:
\[(\w+)].*?\[\/\1]
Проблема в том, что это не сработает в приведенном выше примере, потому что его «дочерний элемент» имеет такой же закрывающий «тег».
Как я мог заставить это регулярное выражение работать, независимо от того, сколько существует вложенных детей (буквально бесконечное число дублированных вложенных детей)?
Вы можете использовать это рекурсивное регулярное выражение в PHP:
$re = '~\s* ( \[some_element\] ( (?: .* | (?1) )* ) \[/some_element\] )~x';
Это даст вам эту строку в соответствующей группе № 2:
Random string chars [some_element]Ramdon[/some_element] some more random chars
Это похоже на работу для рекурсивные паттерны (в php).
Но я, к сожалению, слишком неопытен, чтобы написать образец здесь, не пытаясь 🙁
Может быть, вы можете понять это самостоятельно. Я тоже попробую, но это займет некоторое время …
Хочешь взглянуть на это:
(Слова между {[< и>]} не являются частью шаблона, они описывают, что должен делать подшаблон.)
[(({[< какой-либо способ сопоставления с любой строкой, кроме [word]>]}) | (?Р) )* ]