Окончательное решение для использования регулярных выражений для удаления HTML-вложенных тегов того же типа?

Я несколько дней пытался найти решение с помощью регулярных выражений (прежде чем кто-то скажет: я знаю, что должен был использовать библиотеку документов PHP DOM или что-то подобное, но давайте возьмем это как теоретический вопрос), посмотрел ответы вверх, и я наконец пришел с тем, что я покажу в конце этого вопроса.

Далее следует лишь краткое изложение многих вещей, которые я пробовал раньше.

Прежде всего, я имею в виду вложенные теги одного типа:

Text outside any div
<div id="my_id"> bla bla
  <div>
  bla bla bla
    <div style="some style here">
      lalalalala
     </div>
   </div>
    I'm trapped in a div!
</div>
more text outside divs

<div>more divs here!
       <div id="justbeingannoying">radiohead rules</div>
</div>

Теперь представьте, что я хочу удалить все divи их содержание используя регулярное выражение. Таким образом, ожидаемый результат будет:

Text outside any div
more text outside divs

Первая идея будет соответствовать всему. Следующее регулярное выражение сопоставляет теги div со свойствами (style, id и т. Д.):

/<div[^>]*>.*<\/div>/sig

Проблема, конечно, в том, что это будет соответствоватьвсе между началом первого «<div» и последним «</ div>», поэтому оно будет соответствовать «больше текста вне div» (проверьте здесь:https://regex101.com/r/iR8mY2/1 ), чего не хотим мы (я) хотим.

Это можно решить с помощьюМодификатор U (Ungreedy)

/<div[^>]*>.*<\/div>/sigU

но тогда у нас будет проблема сМеньше чем мы хотим: он будет соответствовать только от первого "<div" допервый «» (поэтому, если мы удалим совпадения, кроме некоторых несопоставленных тегов, будет текст «Я пойман в ловушку в div!», который нам не нужен).

Итак, я нашел решение, которое работает как шарм для вложенных скобок, квадратных скобок и т.д .:

/\[([^\[\]]*+|(?R))*\]/si

По сути, это то, что мы находим открывающую квадратную скобку, затем сопоставляем что-либо *, которое не является ни открывающей, ни закрывающей квадратной скобкой * ИЛИ рекурсивной структурой этого, находя закрывающую квадратную скобку.

То, что я сейчас работаю, это плохое решение: сначала я заменяю все открывающие теги квадратной скобкой (чего не может быть в моем коде по другим причинам), затем закрывающий тег для закрывающей квадратной скобки, а затем я используйте предыдущее регулярное выражение.Не очень элегантное решение, я знаю.

Дело в том, что я действительно хочузнать как это можно сделать с помощью одного регулярного выражения. Кажется очевидным, чем заменить в предыдущем регулярном выражении «[» и «]» на HTML-тегиимеет работать. Но это не так просто. Проблема в отрицании символов («[^ .......]» не работает для таких строк, как «div». Кажется, что-то похожее может быть достигнуто с помощью этого:

.+?(?=<div>)

и, конечно, то же самое для закрывающего тега

.+?(?=<\/div>

Вот как, более или менее, я пришел к этому регулярному выражению

/<div((.+?(?=<\/div>)|.+?(?=<div>))|(?R))*<\/div>/gis

Который работает именно какпервый регулярное выражение я представил раньше:https://regex101.com/r/yU8pV3/1

Вот мой вопрос:что не так с этим регулярным выражением?

Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос