Expresión regular para tags anidadas (la más interna para hacerlo más fácil)

Investigué bastante sobre esto, pero no pude encontrar un ejemplo práctico de cómo unir tags html anidadas con atributos. Sé que es posible hacer coincidir las tags internas más equilibradas / anidadas sin atributos (por ejemplo, una expresión regular para y sería #

]*>(?:(?> [^<]+ ) |]*>))*?

#x).

Sin embargo, me gustaría ver un patrón de expresiones regulares que encuentre un par de tags html con atributos.

Ejemplo: Básicamente debe coincidir

 
**
**
**
**

y no

 
**
**
**
**

Alguien tiene algunas ideas?

Para fines de prueba, podríamos utilizar: http://www.lumadis.be/regex/test_regex.php


PD. Steven mencionó una solución en su blog (en realidad en un comentario), pero no funciona

Matching Innermost HTML Elements

 $regex = '/
]+?\bid\s*=\s*"MyID"[^>]*>(?:((?:[^<]++|]*>))+)|(
]*>(?>(?1)|(?2))*))?/i';

Solutions Collecting From Web of "Expresión regular para tags anidadas (la más interna para hacerlo más fácil)"

RegEx match las tags abiertas, excepto las tags autocontenidas XHTML

Y de hecho, es absolutamente imposible. HTML tiene algo único, algo mágico, que es inmune a RegEx.

Creé un breve script de python para resolver el problema de administrar tags anidadas. Funciona felizmente con html y con otras syntax anidadas terribles también, como código wiki. ¡Hicrónicamente, lo escribí para evitar la expresión regular! No pude entenderlos en absoluto. :-(. Utilicé esa función para todo, funciona muy bien para html y xml. También es rápido, ya que solo utiliza la búsqueda de cadenas básica. Estoy muy contento de saber que Regex no puede ayudar. 🙂

Me gustaría compartir el guión, si alguno de ustedes está interesado; pero considere, no soy un progtwigdor, ¡supongo que el problema ha sido resuelto por un largo tiempo!

Puede encontrarme en mi página de discusión en it.source: http://it.wikisource.org/wiki/Discussioni_utente:Alex_brollo

Coincidiendo con los pares más cercanos que coinciden con las

y , más sus atributos y contenido:

#

)).)*

#s

La clave aquí es que (?:(?!STRING).)* Es para cadenas como [^CHAR]* es para los caracteres.

Crédito: https://stackoverflow.com/a/6996274


Ejemplo en PHP:

 < ?php $text = <<<'EOD' 
in 1
in 2
in 3
in 4
in 5
EOD; $matches = array(); preg_match_all('#
)).)*
#s', $text, $matches); foreach ($matches[0] as $index => $match) { echo "************" . "\n" . $match . "\n"; }

Productos:

 ************ 
in 3
************
in 5