In realtà
<img src="imgtag.gif" alt="<img>" />
non è un HTML valido e non è neanche un XML valido.
Non è un XML valido perché "<" e ">" non sono caratteri validi all'interno delle stringhe di attributi. Devono essere salvati utilizzando le entità XML corrispondenti & lt; e & gt;
Non è un codice HTML valido neanche perché il modulo di chiusura breve non è consentito in HTML (ma è corretto in XML e XHTML). Il tag 'img' è anche un tag implicitamente chiuso secondo la specifica HTML 4.01. Ciò significa che chiuderlo manualmente è in realtà errato ed equivale a chiudere qualsiasi altro tag due volte.
La versione corretta in HTML è
<img src="imgtag.gif" alt="<img>">
e la versione corretta in XHTML e XML è
<img src="imgtag.gif" alt="<img>"/>
Anche il seguente esempio che hai fornito non è valido
<
tag
attr="5"
/>
Questo non è neanche HTML o XML valido. Il nome del tag deve essere proprio dietro '<', sebbene gli attributi e la chiusura '>' possano essere dove vogliono. Quindi l'XML valido è in realtà
<tag
attr="5"
/>
Ed eccone un altro più funkier: puoi effettivamente scegliere di usare "o" come carattere di citazione dell'attributo
<img src="image.gif" alt='This is single quoted AND valid!'>
Tutti gli altri motivi che sono stati pubblicati sono corretti, ma il problema più grande con l'analisi dell'HTML è che le persone di solito non capiscono correttamente tutte le regole di sintassi. Il fatto che il tuo browser interpreti il tuo tagsoup come HTML non significa che tu abbia effettivamente scritto HTML valido.
Modifica: E anche stackoverflow.com è d'accordo con me per quanto riguarda la definizione di valido e non valido. Il tuo XML / HTML non valido non è evidenziato, mentre la mia versione corretta è.
Fondamentalmente, XML non è fatto per essere analizzato con regexps. Ma non c'è nemmeno motivo di farlo. Esistono molti, molti parser XML per ogni lingua. È possibile scegliere tra parser SAX, parser DOM e pull parser. Tutti questi sono garantiti per essere molto più veloci rispetto all'analisi con una regexp e quindi è possibile utilizzare tecnologie interessanti come XPath o XSLT sull'albero DOM risultante.
La mia risposta è quindi: non solo è difficile analizzare XML con regexps, ma è anche una cattiva idea. Basta usare uno dei milioni di parser XML esistenti e sfruttare tutte le funzionalità avanzate di XML.
L'HTML è troppo difficile anche solo per provare ad analizzare da solo. Innanzitutto la sintassi legale ha molte piccole sottigliezze di cui potresti non essere a conoscenza, e in secondo luogo, l'HTML in natura è solo un enorme mucchio puzzolente di (ottieni la mia deriva). Esistono diverse librerie di parser lassisti che fanno un buon lavoro nella gestione di HTML come tag soup, basta usarle.