RegEx соответствует родительским элементам, содержащим дубликаты

Название, вероятно, сбивает с толку, но я понятия не имею, как правильно сформулировать это.

Так вот моя цель. У меня есть эта строка (или что-то подобное):

[some_element]Random string chars [some_element]Ramdon[/some_element] some more random chars[/some_element]

(Некоторые из вас могут признать, что это шорткоды WordPress, но эта методология будет полезна и для меня).

Что мне нужно сделать, это сопоставить родительский «элемент». Мой обычный подход может быть что-то вроде этого:

\[(\w+)].*?\[\/\1]

Проблема в том, что это не сработает в приведенном выше примере, потому что его «дочерний элемент» имеет такой же закрывающий «тег».

Как я мог заставить это регулярное выражение работать, независимо от того, сколько существует вложенных детей (буквально бесконечное число дублированных вложенных детей)?

2

Решение

Вы можете использовать это рекурсивное регулярное выражение в PHP:

$re = '~\s* ( \[some_element\] ( (?: .* | (?1) )* ) \[/some_element\] )~x';

RegEx Demo

Это даст вам эту строку в соответствующей группе № 2:

Random string chars [some_element]Ramdon[/some_element] some more random chars
1

Другие решения

Это похоже на работу для рекурсивные паттерны (в php).
Но я, к сожалению, слишком неопытен, чтобы написать образец здесь, не пытаясь 🙁
Может быть, вы можете понять это самостоятельно. Я тоже попробую, но это займет некоторое время …

Хочешь взглянуть на это:

(Слова между {[< и>]} не являются частью шаблона, они описывают, что должен делать подшаблон.)

[(({[< какой-либо способ сопоставления с любой строкой, кроме [word]>]}) | (?Р) )* ]
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector