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?

10voto

Robin Day Punkte 97662

Machen die Leute tatsächlich einen Fehler, wenn sie eine Regex verwenden, oder ist sie einfach gut genug für die Aufgabe, die sie zu erfüllen versuchen?

Ich stimme voll und ganz zu, dass das Parsen von html und xml mit einem Regex nicht möglich ist, wie andere Leute geantwortet haben.

Wenn Ihre Anforderung jedoch nicht darin besteht, html/xml zu parsen, sondern nur ein kleines Datenelement in einem "bekannt guten" Teil von html/xml zu erhalten, dann ist vielleicht ein regulärer Ausdruck oder sogar eine noch einfachere "Teilzeichenkette" gut genug.

7voto

Isaac Rabinovitch Punkte 517

Ich bin versucht zu sagen: "Erfinden Sie das Rad nicht neu". Außer, dass XML ein wirklich, wirklich komplexes Format. Vielleicht sollte ich also sagen: "Erfinde das Synchrotron nicht neu".

Vielleicht beginnt das richtige Klischee mit "wenn man nur einen Hammer hat...". Sie wissen, wie man reguläre Ausdrücke verwendet, reguläre Ausdrücke sind gut im Parsen, warum also eine XML-Parsing-Bibliothek lernen?

Da das Parsen von XML hart . Jeder Aufwand, den Sie dadurch sparen, dass Sie nicht lernen müssen, eine XML-Parsing-Bibliothek zu verwenden, wird durch die Menge an kreativer Arbeit und Fehlersuche, die Sie leisten müssen, mehr als wettgemacht. Googeln Sie in Ihrem eigenen Interesse nach "XML-Bibliothek" und nutzen Sie die Arbeit von jemand anderem.

6voto

chaos Punkte 118918

Normalerweise schreiben die Leute gierige Muster, was oft genug dazu führt, dass ein nicht durchdachtes .* große Teile der Datei in das größtmögliche <foo>.*</foo> schlürft.

6voto

Michael Kay Punkte 146092

Ich denke, die Probleme laufen auf Folgendes hinaus:

  1. Die Regex ist fast ausnahmslos falsch. Es gibt legitime Eingaben, die sie nicht richtig zuordnen kann. Wenn man hart genug arbeitet, kann man sie zu 99 % oder 99,999 % korrekt machen, aber 100 % korrekt zu machen ist fast unmöglich, schon allein wegen der seltsamen Dinge, die XML durch die Verwendung von Entitäten erlaubt.

  2. Wenn die Regex selbst für 0,00001 % der Eingaben falsch ist, haben Sie ein Sicherheitsproblem, weil jemand die eine Eingabe entdecken kann, die Ihre Anwendung zerstört.

  3. Wenn die Regex korrekt genug ist, um 99,99 % der Fälle abzudecken, wird sie völlig unlesbar und unwartbar sein.

  4. Es ist sehr wahrscheinlich, dass ein Regex bei mittelgroßen Eingabedateien sehr schlecht funktioniert. Meine erste Begegnung mit XML bestand darin, ein Perl-Skript, das (fehlerhaft) eingehende XML-Dokumente analysierte, durch einen richtigen XML-Parser zu ersetzen. Wir ersetzten nicht nur 300 Zeilen unlesbaren Code durch 100 Zeilen, die jeder verstehen konnte, sondern verbesserten auch die Antwortzeit der Benutzer von 10 Sekunden auf etwa 0,1 Sekunden.

5voto

Adam Arold Punkte 27672

Ich glaube ce klassisch hat die Informationen, die Sie suchen. Sie können den Punkt in einem der Kommentare dort finden:

Ich denke, der Fehler liegt darin, dass HTML eine Chomsky Typ 2 Grammatik ist (kontextfreie Grammatik) und RegEx eine Chomsky-Typ-3-Grammatik (regulärer Ausdruck). Da eine Typ-2-Grammatik grundsätzlich komplexer ist als eine Typ-3-Grammatik - kann man unmöglich hoffen, dass dies funktioniert . Aber viele werden es versuchen, einige werden Erfolg haben und andere werden den Fehler finden und Sie völlig durcheinander bringen.

Einige weitere Informationen aus Wikipedia: Chomsky-Hierarchie

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