Wann sollten Sie reguläre Ausdrücke mit HTML verwenden? [geschlossen]

8

Obwohl es absolut richtig ist, dass regexp nicht das richtige Werkzeug ist, um HTML-Dokumente vollständig zu parsen, sehe ich eine Menge Leute, die jede Frage zu regexp blind ignorieren, wenn sie im vorgeschlagenen Text ein einzelnes HTML-Tag sehen.

Da wir viele Beispiele dafür sehen, dass regexp nicht das richtige Werkzeug ist, frage ich Ihre Meinung dazu: In welchen Fällen ist eine einfache Musterübereinstimmung eine bessere Lösung als ein vollständiges Parsing Motor?

    
Matteo Riva 29.11.2009, 18:13
quelle

10 Antworten

11

Wenn bekannt ist, dass der Satz von HTML, den Sie mit einem regulären Ausdruck analysieren möchten, mit einer Art Muster übereinstimmt. z.B. Wenn Sie wissen, dass es keinen auskommentierten HTML-Code oder komplexe Szenarien usw. gibt.

z.B. Ich predige oft, dass man Regexps nicht für HTML verwenden sollte, aber wenn ich eine Menge von HTML habe, die mir vertraut ist, einfach ist und dass ich leicht Post-Manipulation überprüfen kann, dann habe ich keine Bedenken, eine Regexp zu verwenden das.

    
Brian Agnew 29.11.2009, 18:17
quelle
4

Ich denke, die beste Antwort hier ist: Reguläre Ausdrücke sind das richtige Werkzeug, außer wenn sie es nicht sind.

Ich denke, wenn Sie Ihr Problem mit Regex sauber und effektiv lösen können, dann gehen Sie darauf. Aber ich habe viel zu viele Regex-Hacks gesehen, weil der Programmierer / Webdesigner einfach nur faul ist.

Regex ist leistungsfähig und eines der besten Werkzeuge, die ein Programmierer lernen kann, aber Sie müssen auch lernen, wann Sie es verwenden sollten und wann Sie etwas anderes verwenden sollten.

    
Robert Greiner 29.11.2009 18:18
quelle
3

Jeff Atwood diskutiert es ausführlich in seinen Blog-Posts mit dem Titel Programmierung ist schwer Gehen wir einkaufen und Parsing HTML Der Cthulhu Weg .

  

"Ja, im Allgemeinen ist es eine schlechte Idee, beim Analysieren von HTML reguläre Ausdrücke zu verwenden. Wir sollten Neulingen bei der Entwicklung das unbedingt beibringen. Auch wenn es ein scheinbar unendlicher Job ist. Aber wir sollten ihnen auch beibringen Es gibt einen echten Unterschied zwischen dem Analysieren von HTML und der einfachen Zweckmäßigkeit, einige Strings zu verarbeiten, und wie man erkennt, welcher Ansatz für die jeweilige Aufgabe geeignet ist. "

Weitere Details finden Sie in den oben genannten Posts.

    
Gregory Pakosz 29.11.2009 18:31
quelle
2

Offensichtlich in den einfachsten Fällen wie

%Vor%

Sie könnten mit einer Regex auskommen. Aber selbst dann könnte ein perfekt gültiges HTML-Tag in so vielen verschiedenen Varianten vorkommen:

%Vor%

dass der Regex, um sie zuverlässig zu fangen, riesig wird. Ein DOM-basierter Parser wird es parsen, Ihnen eine korrekte Fehlermeldung geben, wenn es fehlschlägt, und stabile Ergebnisse liefern.

    
Pekka 웃 29.11.2009 18:19
quelle
1

Wenn Sie sicherstellen können, dass das Muster, das Sie zuordnen müssen, innerhalb eines einzelnen HTML-Tags liegt, könnten Sie vielleicht einen regulären Ausdruck erstellen, der diesem entspricht.

Mit anderen Worten, nicht , wenn Sie einen Ausdruck zum Suchen nach übereinstimmenden Tags / Endtags und nicht benötigen, wenn der zu vergleichende Inhalt verschachtelte Tags, Kommentare und CDATA enthält Abschnitte usw.

    
Bill Karwin 29.11.2009 18:17
quelle
1

Wenn die Informationen, die Sie verwenden, eine normale Grammatik haben, dann sind Regexs großartig. HTML hat keine reguläre Grammatik, daher sind die Dinge komplexer.

Regexs sind geeignet, wenn Sie absolut 100% wissen, was Sie suchen - ersetzen:

%Vor%

mit

%Vor%

In einem Dokument, von dem Sie die vollständige Kontrolle haben, wäre das sinnvoll, aber echtes HTML ist nicht so.

    
Rich Bradshaw 29.11.2009 18:18
quelle
1

Wenn Sie wissen, was Sie tun!

; )

    
Bart Kiers 29.11.2009 18:25
quelle
1

Beachtenswert ist, dass es zwei Hauptquellen für die Verarbeitung von HTML mit regulären Ausdrücken gibt. Eine Quelle hat mit der Wahrscheinlichkeit von Junk-HTML zu tun, das unvorhersehbar falsch formatiert ist. Dies ist selbst ein berechtigter Grund, bei der Annäherung an HTML-Verarbeitung mit Regex skeptisch zu sein, und wirft von Anfang an viele Anwendungsfälle auf. Das Problem ist, dass diese Quelle häufig verwendet wird, um "das Baby mit dem Bade auszuschütten", und wird oft mit der zweiten Hauptquelle des Einwands verschmolzen (und normalerweise beide ungesagt gelassen), obwohl sie völlig unabhängig sind.

>

Die andere Hauptquelle des Einwands hat mit der Komplexität der HTML-Sprache zu tun, die etwas über die idealisierte, theoretische Vorstellung von "regulärem Ausdruck" hinausgeht, die für viele Anwendungsfälle zu allgemein ist - aber normalerweise auf der ganzen Linie angewendet wird. Der Einwand geht etwa so:

  1. Truism: Reguläre Ausdrücke verarbeiten reguläre Grammatiken.
  2. Truism: HTML ist keine reguläre Grammatik.
  3. HTML kann nicht mit regulären Ausdrücken verarbeitet werden.

Ich denke, dass viele Leute diese Binsenweisheiten wirklich für bare Münze nehmen, ohne darüber nachzudenken, was mit ihnen gemeint ist. Bill Karwin, in einer anderen Antwort hier, erwähnte einige Fälle, in denen HTML keine reguläre Grammatik ist, aber dieses Argument fällt auseinander, wenn der Kontext eine "Regex" -Engine ist, die nicht-reguläre Merkmale hat (wie Rückverweise oder sogar Rekursion). Diese Funktionen lösen viele der "nicht regulären Grammatik" -Einwände, können aber bei fehlerhaften Dokumenten immer noch fehlschlagen.

Diese Unterscheidung wird selten gemacht, und es wird selten darauf hingewiesen, dass die meisten modernen "regulären" Expressionsbibliotheken Fähigkeiten haben, die weit über die normale Sprachverarbeitung hinausgehen. Ich denke, dies sind wichtige Dinge, die es zu beachten gilt, wenn "normale" Ausdrücke für das entsprechende Werkzeug zur Verarbeitung von HTML ausgewertet werden.

    
eyelidlessness 30.11.2009 00:12
quelle
0

Sie können regexp verwenden, wenn Sie HTML analysieren, über das Sie die Kontrolle haben, oder Sie schreiben einen Parser für eine bestimmte HTML-Seite. Sie sollten regexp nicht verwenden, wenn Sie versuchen, universellen Parser zu erstellen.

    
serg 30.11.2009 05:33
quelle
0

Ich habe gerade ein Beispiel für regexp gefunden, das den HTML-Parser schlägt. Ich musste einige Informationen aus einer langen Seite (8231 Zeilen, 400kb) extrahieren und versuchte zuerst simple_html_dom . Da ich wegen des Problems, das in diese Frage gemeldet wurde, steckengeblieben bin , Ich entschied mich für den alternativen Ansatz und mir wurde klar, dass ich eigentlich nur Informationen brauchte, die in den ersten 416 Zeilen dieser Datei enthalten waren (~ 4% der Gesamtmenge) und das gesamte DOM in den Speicher zu laden schien eine riesige Verschwendung von Ressourcen.

Nun weiß ich immer noch nicht, warum simplehtmld das nicht schafft, daher kann ich die Leistung der beiden Lösungen nicht wirklich vergleichen, aber die regexp-Version lädt nur so viele Zeilen wie nötig (bis zum Ende des <ul> Ich bin interessiert und nicht mehr) und ist sehr schnell.

    
Matteo Riva 30.09.2010 11:59
quelle

Tags und Links