Espressione regolare per tag nidificati (più interno per renderlo più semplice)

Ho ricercato un po ‘questo, ma non sono riuscito a trovare un esempio funzionante su come abbinare i tag html nidificati con gli attributi. So che è ansible abbinare tag più interni bilanciati / nidificati senza attributi (ad esempio un’espressione regolare per e sarebbe #

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

#x).

Tuttavia, mi piacerebbe vedere un modello regex che trova una coppia di tag html con attributi.

Esempio: fondamentalmente dovrebbe corrispondere

 
**
**
**
**

e non

 
**
**
**
**

Qualcuno ha qualche idea?

A scopo di test possiamo usare: http://www.lumadis.be/regex/test_regex.php


PS. Steven ha citato una soluzione nel suo blog (in realtà in un commento), ma non funziona

Matching Innermost HTML Elements

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

RegEx associa tag aperti ad eccezione dei tag autonomi XHTML

E infatti, è assolutamente imansible. HTML ha qualcosa di unico, qualcosa di magico, che è immune a RegEx.

Ho creato un breve script python per risolvere il problema della gestione dei tag nidificati. Funziona felicemente con html e con altre, terribili syntax annidate, come codice wiki. Ironicamente, l’ho scritto per evitare regex! Non riuscivo a capirle affatto. :-(. Ho usato quella funzione per qualsiasi cosa, funziona molto bene per html e xml. È anche veloce, dal momento che usa solo la ricerca delle stringhe di base. Sono molto felice di sapere che regex non può aiutare. 🙂

Mi piacerebbe condividere la sceneggiatura, se qualcuno di voi è interessato; ma considera, non sono un programmatore, presumo che il problema sia stato risolto per molto tempo!

Puoi trovarmi alla mia pagina di discussione in it.source: http://it.wikisource.org/wiki/Discussioni_utente:Alex_brollo

Abbinamento delle coppie di

e più intimi, oltre ai relativi attributi e contenuti:

#

)).)*

#s

La chiave qui è che (?:(?!STRING).)* È per le stringhe come [^CHAR]* è per i caratteri.

Credito: https://stackoverflow.com/a/6996274


Esempio in 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"; }

Uscite:

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