415 Stimmen

Können Sie anhand von Beispielen erläutern, warum es schwierig ist, XML und HTML mit einer Regex zu parsen?

Ein Fehler, den ich bei den Leuten sehe über et noch einmal versucht, XML oder HTML mit einer Regex zu parsen. Hier sind einige der Gründe, warum das Parsen von XML und HTML schwierig ist:

Die Leute wollen eine Datei als eine Folge von Zeilen behandeln, aber das ist richtig:

<tag
attr="5"
/>

Die Leute wollen < oder <tag als den Anfang eines Tags behandeln, aber so etwas gibt es auch in der freien Wildbahn:

<img src="imgtag.gif" alt="<img>" />

Oft möchte man beginnende Tags mit endenden Tags abgleichen, aber XML und HTML erlauben es, dass Tags sich selbst enthalten (was traditionelle Regexe überhaupt nicht können):

<span id="outer"><span id="inner">foo</span></span> 

Oft möchte man einen Abgleich mit dem Inhalt eines Dokuments durchführen (z. B. das berühmte Problem "alle Telefonnummern auf einer bestimmten Seite finden"), aber die Daten sind möglicherweise markiert (auch wenn sie bei der Betrachtung normal erscheinen):

<span class="phonenum">(<span class="area code">703</span>)
<span class="prefix">348</span>-<span class="linenum">3020</span></span>

Kommentare können schlecht formatierte oder unvollständige Tags enthalten:

<a href="foo">foo</a>
<!-- FIXME:
    <a href="
-->
<a href="bar">bar</a>

Welche anderen Probleme sind Ihnen bekannt?

1voto

Erutan409 Punkte 682

Ich habe eine vereinfachte Antwort auf dieses Problem gegeben ici . Auch wenn die 100 %-Marke damit nicht erreicht wird, erkläre ich, wie es möglich ist, wenn man bereit ist, einige Vorarbeiten zu leisten.

0voto

Maxim Suslov Punkte 3347

Im Allgemeinen kann XML nicht mit Regex geparst werden, da die XML-Grammatik keineswegs regulär ist. Vereinfacht gesagt, können Regexe nicht zählen (na ja, Perl-Regexe können vielleicht tatsächlich Dinge zählen), so dass man keine "open-close"-Tags ausgleichen kann.

Ich bin anderer Meinung. Wenn Sie rekursiv in Regex verwenden, können Sie leicht offene und geschlossene Tags finden.

Hier Ich habe ein Beispiel für Regex gezeigt, um Parsing-Fehler der Beispiele in der ersten Nachricht zu vermeiden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X