Solução final para usar o regex para remover tags aninhadas html do mesmo tipo?

Estive dias tentando encontrar uma solução WITH regex (antes que alguém diga: eu sei que deveria estar usando a biblioteca de documentos DOM do PHP ou algo parecido, mas vamos tomar isso como uma questão teórica), procurando respostas e finalmente cheguei com o que mostrarei no final desta pergunta.

O que se segue é apenas um resumo de muitas coisas que eu tentei antes.

Primeiro de tudo, o que quero dizer com tags aninhadas do mesmo tipo é:

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>

Agora imagine que eu quero remover todos os divse seu conteúdo usando regex. Portanto, o resultado pretendido seria:

Text outside any div
more text outside divs

A primeira ideia seria combinar tudo. O seguinte regex corresponde a tags div com propriedades (estilo, ID, etc):

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

O problema, é claro, é que isso corresponderátudo entre o início do primeiro "<div" e o último "</ div>", portanto também corresponderá a "mais texto fora de divs" (verifique aqui:https://regex101.com/r/iR8mY2/1 ), que não é o que nós (I) queremos.

Isso pode ser resolvido usando oModificador U (Ungreedy)

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

mas então teremos o problema de terMenos do que queremos: corresponderá apenas do primeiro "<div" até oprimeiro "" (portanto, se removermos as correspondências, além de algumas tags sem correspondência, haverá o texto "Estou preso em uma div!", o que não queremos).

Então, eu encontrei uma solução que funciona como um encanto para parênteses aninhados, colchetes, etc:

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

Basicamente, o que isso faz é encontrar um colchete de abertura e, em seguida, combinar qualquer coisa * que não seja uma abertura nem um colchete de fechamento * OU uma estrutura recursiva, encontrar um colchete de fechamento.

O que estou trabalhando agora é uma solução ruim: basicamente, primeiro substituo todas as tags de abertura por um colchete (que não pode estar no meu código por outras razões), depois a tag de fechamento de um colchete de fechamento e depois use o regex anterior.Não é uma solução muito elegante, eu sei.

O fato é que eu realmente queroconhecer como isso pode ser feito com apenas um regex. Parece óbvio que substituir no regex anterior o "[" e o "]" pelas tags htmltem trabalhar. Mas não é assim tão fácil. O problema é a negação de caracteres ("[^ .......]" não funciona para cadeias de caracteres como "div". Parece que algo semelhante pode ser alcançado com isso:

.+?(?=<div>)

e, claro, o mesmo para a tag de fechamento

.+?(?=<\/div>

Foi assim que, mais ou menos, cheguei a esse regex

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

O que funciona exatamente como oprimeiro regex que apresentei antes:https://regex101.com/r/yU8pV3/1

Então aqui está a minha pergunta:o que há de errado com esse regex?

Obrigado!

questionAnswers(1)

yourAnswerToTheQuestion