HTML / XML ist in Markup und Inhalt unterteilt. Regex ist nur nützlich, wenn Sie eine lexikalische Tag-Analyse durchführen. Ich denke, Sie könnten den Inhalt ableiten. Es wäre eine gute Wahl für einen SAX-Parser. Tags und Inhalte können an eine benutzerdefinierte Funktion gesendet werden, mit der das Verschachteln / Schließen von Elementen verfolgt werden kann.
Das Parsen der Tags kann mit Regex erfolgen und zum Entfernen von Tags aus einem Dokument verwendet werden.
In jahrelangen Tests habe ich das Geheimnis gefunden, wie Browser gut und schlecht geformte Tags analysieren.
Die normalen Elemente werden mit dieser Form analysiert:
Der Kern dieser Tags verwendet diesen regulären Ausdruck
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
Sie werden dies [^>]?
als eine der Alternativen bemerken . Dies entspricht unausgeglichenen Anführungszeichen von schlecht geformten Tags.
Es ist auch die Wurzel aller Übel für reguläre Ausdrücke. Die Art und Weise, wie es verwendet wird, löst einen Bump-Along aus, um den gierigen, mit Must-Match quantifizierten Container zu befriedigen.
Bei passiver Verwendung gibt es kein Problem. Wenn Sie jedoch eine Übereinstimmung erzwingen , indem Sie sie mit einem gewünschten Attribut / Wert-Paar durchsetzen und keinen ausreichenden Schutz vor Rückverfolgung bieten, ist dies ein außer Kontrolle geratener Albtraum.
Dies ist die allgemeine Form für einfache alte Tags. Beachten Sie die [\w:]
Darstellung des Tag-Namens? In Wirklichkeit sind die legalen Zeichen, die den Tag-Namen darstellen, eine unglaubliche Liste von Unicode-Zeichen.
<
(?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
>
Im weiteren Verlauf sehen wir auch, dass Sie einfach nicht nach einem bestimmten Tag suchen können, ohne ALLE Tags zu analysieren . Ich meine, Sie könnten, aber es müsste eine Kombination von Verben wie (* SKIP) (* FAIL) verwendet werden, aber dennoch müssen alle Tags analysiert werden.
Der Grund dafür ist, dass die Tag-Syntax möglicherweise in anderen Tags usw. verborgen ist.
Um alle Tags passiv zu analysieren, wird ein regulärer Ausdruck wie der folgende benötigt. Dieser besondere passt auch zu unsichtbaren Inhalten .
Wenn neues HTML oder XML oder andere neue Konstrukte entwickeln, fügen Sie es einfach als eine der Alternativen hinzu.
Hinweis zur Webseite - Ich habe noch nie eine Webseite (oder xhtml / xml) gesehen, mit der dies
Probleme hatte. Wenn Sie einen finden, lassen Sie es mich wissen.
Leistungshinweis - Es geht schnell. Dies ist der schnellste Tag-Parser, den ich gesehen habe
(es kann schneller sein, wer weiß).
Ich habe mehrere spezifische Versionen. Es eignet sich auch hervorragend als Schaber
(wenn Sie ein praktischer Typ sind).
Komplette rohe Regex
<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>
Formatierter Look
<
(?:
(?:
(?:
# Invisible content; end tag req'd
( # (1 start)
script
| style
| object
| embed
| applet
| noframes
| noscript
| noembed
) # (1 end)
(?:
\s+
(?>
" [\S\s]*? "
| ' [\S\s]*? '
| (?:
(?! /> )
[^>]
)?
)+
)?
\s* >
)
[\S\s]*? </ \1 \s*
(?= > )
)
| (?: /? [\w:]+ \s* /? )
| (?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
| \? [\S\s]*? \?
| (?:
!
(?:
(?: DOCTYPE [\S\s]*? )
| (?: \[CDATA\[ [\S\s]*? \]\] )
| (?: -- [\S\s]*? -- )
| (?: ATTLIST [\S\s]*? )
| (?: ENTITY [\S\s]*? )
| (?: ELEMENT [\S\s]*? )
)
)
)
>