Eigentlich
<img src="imgtag.gif" alt="<img>" />
ist kein gültiges HTML und auch kein gültiges XML.
Es handelt sich nicht um gültiges XML, da die Zeichen '<' und '>' innerhalb von Attributstrings nicht gültig sind. Sie müssen mit den entsprechenden XML-Entitäten < und > maskiert werden
Es handelt sich auch nicht um gültiges HTML, da die kurze Schlussform in HTML nicht zulässig ist (in XML und XHTML ist sie jedoch korrekt). Der "img"-Tag ist außerdem ein implizit geschlossener Tag gemäß der HTML 4.01-Spezifikation. Das bedeutet, dass das manuelle Schließen des Tags eigentlich falsch ist und dem doppelten Schließen eines anderen Tags entspricht.
Die korrekte Version in HTML lautet
<img src="imgtag.gif" alt="<img>">
und die korrekte Version in XHTML und XML lautet
<img src="imgtag.gif" alt="<img>"/>
Das folgende Beispiel, das Sie angeführt haben, ist ebenfalls ungültig
<
tag
attr="5"
/>
Dies ist auch kein gültiges HTML oder XML. Der Name des Tags muss direkt hinter dem "<" stehen, obwohl die Attribute und das abschließende ">" an beliebiger Stelle stehen können. Das gültige XML ist also eigentlich
<tag
attr="5"
/>
Und hier ist noch ein weiterer lustiger Aspekt: Sie können entweder " oder ' als Anführungszeichen für Ihr Attribut verwenden
<img src="image.gif" alt='This is single quoted AND valid!'>
Alle anderen Gründe, die genannt wurden, sind richtig, aber das größte Problem beim Parsen von HTML ist, dass die Leute in der Regel nicht alle Syntaxregeln richtig verstehen. Die Tatsache, dass Ihr Browser Ihre Tagsuppe als HTML interpretiert, bedeutet nicht, dass Sie tatsächlich gültiges HTML geschrieben haben.
Edit: Und sogar stackoverflow.com stimmt mir zu, was die Definition von gültig und ungültig angeht. Ihr ungültiges XML/HTML wird nicht hervorgehoben, meine korrigierte Version hingegen schon.
Im Grunde ist XML nicht dafür gemacht, mit Regexps geparst zu werden. Es gibt aber auch keinen Grund, dies zu tun. Es gibt viele, viele XML-Parser für jede einzelne Sprache. Sie haben die Wahl zwischen SAX-Parsern, DOM-Parsern und Pull-Parsern. Alle diese sind garantiert viel schneller als das Parsen mit einem Regexp und Sie können dann coole Technologien wie XPath oder XSLT auf den resultierenden DOM-Baum anwenden.
Meine Antwort lautet daher: Das Parsen von XML mit Regexps ist nicht nur schwierig, sondern auch eine schlechte Idee. Verwenden Sie einfach einen der Millionen vorhandenen XML-Parser und nutzen Sie alle fortgeschrittenen Funktionen von XML.
HTML ist einfach zu schwierig, um es selbst zu analysieren. Erstens hat die legale Syntax viele kleine Feinheiten, die Sie vielleicht nicht kennen, und zweitens ist HTML in der freien Wildbahn einfach ein riesiger stinkender Haufen (Sie verstehen, worauf ich hinaus will). Es gibt eine Reihe von laxen Parser-Bibliotheken, die HTML wie eine Tag-Suppe behandeln können, verwenden Sie einfach diese.