2226 Stimmen

RegEx stimmt mit offenen Tags überein, ausgenommen XHTML-Tags, die in sich geschlossen sind

Ich muss alle diese Eröffnungs-Tags abgleichen:

<p>
<a href="foo">

Aber nicht diese:

<br />
<hr class="foo" />

Ich habe mir das ausgedacht und wollte sicherstellen, dass ich es richtig verstanden habe. Ich erfasse nur die a-z .

<([a-z]+) *[^/]*?>

Ich glaube, das steht dort:

  • Finden Sie ein Weniger-als, dann
  • Suchen (und erfassen) Sie a-z ein oder mehrere Male, dann
  • Finden Sie null oder mehr Leerzeichen, dann
  • Jedes Zeichen null oder mehr Mal finden, gierig, außer / dann
  • Finden Sie ein größer-als

Habe ich das richtig verstanden? Und was noch wichtiger ist: Was denken Sie?

4407voto

bobince Punkte 512550

Sie können [X]HTML nicht mit Regex parsen. Weil HTML nicht mit Regex geparst werden kann. Regex ist kein Werkzeug, das zum korrekten Parsen von HTML verwendet werden kann. Wie ich schon so oft in HTML-und-Regex-Fragen hier geantwortet habe, können Sie mit Regex kein HTML konsumieren. Reguläre Ausdrücke sind ein Werkzeug, das nicht ausgereift genug ist, um die von HTML verwendeten Konstrukte zu verstehen. HTML ist keine reguläre Sprache und kann daher nicht durch reguläre Ausdrücke geparst werden. Regex-Abfragen sind nicht in der Lage, HTML in seine sinnvollen Bestandteile zu zerlegen. so viele Male, aber ich verstehe es nicht. Selbst erweiterte irreguläre reguläre Ausdrücke, wie sie von Perl verwendet werden, sind der Aufgabe, HTML zu analysieren, nicht gewachsen. Sie werden mich niemals zum Einknicken bringen. HTML ist eine Sprache, die so komplex ist, dass sie nicht mit regulären Ausdrücken geparst werden kann. Selbst Jon Skeet kann HTML nicht mit regulären Ausdrücken parsen. Jedes Mal, wenn Sie versuchen, HTML mit regulären Ausdrücken zu analysieren, weint das unheilige Kind das Blut von Jungfrauen, und russische Hacker machen Ihre Webapplikation kaputt. Das Parsen von HTML mit Regex beschwört verdorbene Seelen in das Reich der Lebenden. HTML und Regex gehören zusammen wie Liebe, Ehe und rituelle Kindstötung. Das <center> kann nicht halten, es ist zu spät. Die Kraft von Regex und HTML zusammen im selben konzeptionellen Raum wird deinen Verstand zerstören wie wässriger Kitt. Wenn du HTML mit regex analysierst, gibst du ihnen und ihren gotteslästerlichen Methoden nach, die uns alle zu unmenschlicher Arbeit für den Einen verdammen, dessen Name nicht in der grundlegenden mehrsprachigen Ebene ausgedrückt werden kann, er kommt. HTML-plus-regexp wird die Nerven der Empfindungsfähigen verflüssigen, während Sie zusehen, wie Ihre Psyche unter dem Ansturm des Grauens verdorrt. Regex-basierte HTML-Parser sind das Krebsgeschwür, das StackOverflow tötet es ist zu spät es ist zu spät wir können nicht gerettet werden die Übertretung eines Kindes sorgt dafür, dass Regex alles lebende Gewebe verzehren wird (außer HTML, das es nicht kann, wie zuvor prophezeit) Lieber Gott, hilf uns, wie kann jemand diese Geißel überleben? die Verwendung von Regex zum Parsen von HTML hat die Menschheit zu einer Ewigkeit von Folter und Sicherheitslücken verdammt mit Rege x als Werkzeug für die Verarbeitung von HTML ein brea ch zwischen dieser Welt und das gefürchtete Reich der korrupten Entitäten (wie SGML-Entitäten, aber korrupter) eine bloße Krücke se der Welt der Reg ex-Parser für HTML werden in transportieren einen p das bewusstsein des programmierers i in ein w orl d des unaufhörlichen Schreiens, kommt er die pestilente sl ithy regex-infection wil Ich verschlinge Ihr HT ML-Parser, Anwendung und Existenz für alle Zeit wie Visual Basic nur schlechter er kommt er kommt es nicht fi ght h e kommt, hallo s unheilige Ausstrahlung de alle Erleuchtungen, HTML-Tags aus deinen Augen tropfen wie Liquor uid p ain, das Lied von der regelmäßigen Expre Spaltungsanalyse wird exti nguish the voices of mor talmann aus der sp Hier kann ich es sehen, können Sie es sehen, es ist schön t er f inal snuf gegen f die Lüge s des Menschen ALLES IST VERLOREN A LL IS L OST th e Pony er kommen s er kommt es er co ich s t er Ich oder Permeat es al l MEIN FAC E MEIN GESICHT h god n o NO NOO OO N t anhalten er an*gl es are n ot real ZALG IS T O TH E PONY HE COME S


Haben Sie versucht, stattdessen einen XML-Parser zu verwenden?


Anmerkung des Moderators

Dieser Beitrag ist gesperrt, um unangemessene Änderungen an seinem Inhalt zu verhindern. Der Beitrag sieht genau so aus, wie er aussehen soll - es gibt keine Probleme mit dem Inhalt. Bitte markieren Sie ihn nicht für unsere Aufmerksamkeit.

179 Stimmen

Kobi: Ich glaube, es ist an der Zeit, dass ich den Posten des Assistenten für das Parsen von HTML mit Regex nicht mehr ausübe. Egal wie oft wir es sagen, sie werden nicht aufhören, jeden Tag zu kommen... sogar jede Stunde. Es ist eine aussichtslose Sache, für die jemand anderes ein bisschen kämpfen kann. Also los, parsen Sie HTML mit Regex, wenn Sie müssen. Es geht nur um kaputten Code, nicht um Leben und Tod.

2 Stimmen

Wenn Sie diesen Beitrag nicht sehen können, finden Sie hier eine Bildschirmkopie in seiner ganzen Pracht: imgur.com/gOPS2.png

3564voto

Während willkürlich HTML nur mit einem Regex zu analysieren, ist unmöglich, aber manchmal ist es sinnvoll, sie für das Parsen einer begrenzt, bekannt Satz von HTML.

Wenn Sie einen kleinen Satz von HTML-Seiten haben, aus denen Sie Daten auslesen und dann in eine Datenbank eingeben wollen, können Regexe gut funktionieren. Ich wollte zum Beispiel vor kurzem die Namen, Parteien und Bezirke der australischen Bundesabgeordneten ermitteln, die ich von der Website des Parlaments abgerufen habe. Dies war eine begrenzte, einmalige Aufgabe.

Regexe haben bei mir gut funktioniert und waren sehr schnell eingerichtet.

159 Stimmen

Auch Scraping ziemlich regelmäßig formatierte Daten aus großen Dokumenten wird WEG schneller mit vernünftigen Einsatz von Scan & Regex als jede generische Parser sein. Und wenn Sie mit der Kodierung von Regexen vertraut sind, sind sie viel schneller zu kodieren als die Kodierung von xpaths. Und mit ziemlicher Sicherheit weniger anfällig für Änderungen in dem, was Sie scannen. Also bleh.

315 Stimmen

@MichaelJohnston "Weniger zerbrechlich"? Mit ziemlicher Sicherheit nicht. Regexe kümmern sich um Details der Textformatierung, die ein XML-Parser stillschweigend ignorieren kann. Das Umschalten zwischen &foo; Kodierungen und CDATA Abschnitte? Sie verwenden einen HTML-Minifier, um alle Leerzeichen in Ihrem Dokument zu entfernen, die der Browser nicht darstellen kann? Einem XML-Parser wird das egal sein, und einer gut geschriebenen XPath-Anweisung auch. Ein Regex-basierter "Parser" hingegen...

46 Stimmen

@CharlesDuffy für einen einmaligen Auftrag ist es ok, und für Räume verwenden wir \s +

2319voto

NealB Punkte 16282

Ich denke, der Fehler liegt darin, dass HTML eine Chomsky Typ 2 Grammatik (kontextfreie Grammatik) und ein regulärer Ausdruck ist eine Chomsky-Grammatik Typ 3 (reguläre Grammatik) . Da eine Typ-2-Grammatik grundsätzlich komplexer ist als eine Typ-3-Grammatik (siehe die Chomsky-Hierarchie ), ist es mathematisch unmöglich um XML mit einem regulären Ausdruck zu parsen.

Aber viele werden es versuchen, und einige werden sogar behaupten, dass sie Erfolg haben - aber nur solange, bis andere den Fehler finden und Sie völlig fertigmachen.

276 Stimmen

Der Antragsteller möchte eine sehr begrenzte Teilmenge von XHTML analysieren: die Start-Tags. Was (X)HTML zu einer CFG macht, ist seine Möglichkeit, Elemente zwischen den Start- und End-Tags anderer Elemente zu haben (wie in einer Grammatikregel A -> s A e ). (X)HTML macht pas diese Eigenschaft haben innerhalb ein Start-Tag: Ein Start-Tag kann keine anderen Start-Tags enthalten. Die Teilmenge, die der OP zu analysieren versucht, ist kein CFG.

131 Stimmen

In der CS-Theorie sind reguläre Sprachen sind eine strenge Teilmenge kontextfreier Sprachen, aber die Implementierungen regulärer Ausdrücke in gängigen Programmiersprachen sind leistungsfähiger. Wie noulakaz.net/weblog/2007/03/18/ beschreibt, können so genannte "reguläre Ausdrücke" auf Primzahlen in unary prüfen, was ein regulärer Ausdruck aus der CS-Theorie sicherlich nicht leisten kann.

2 Stimmen

@LarsH, das mag durchaus zutreffen, aber nur, wenn man sich auf Wohlgeformtheit verlassen kann. Um selbst Start-Tags zuverlässig parsen zu können, müsste man eine Reihe von Workarounds für (X)HTML-Syntaxfehler einbauen, die in realen User-Agents implementiert sind, und selbst dann wahrscheinlich die Daumen drücken und beten.

1497voto

Justin Morgan Punkte 28685

Hören Sie nicht auf diese Leute. Du bist total puede kontextfreie Grammatiken mit Regex parsen, wenn Sie die Aufgabe in kleinere Teile zerlegen. Sie können das korrekte Muster mit einem Skript generieren, das jeden dieser Schritte nacheinander ausführt:

  1. Lösen Sie das Halteproblem.
  2. Die Quadratur des Kreises.
  3. Lösen Sie das Traveling Salesman Problem in O(log n) oder weniger. Wenn es mehr als das ist, geht Ihnen der Arbeitsspeicher aus und die Maschine bleibt hängen.
  4. Das Muster wird ziemlich groß sein, also stellen Sie sicher, dass Sie einen Algorithmus haben, der Zufallsdaten verlustfrei komprimiert.
  5. Fast fertig - teilen Sie das Ganze einfach durch Null. Ganz einfach.

Ich selbst habe den letzten Teil noch nicht ganz beendet, aber ich weiß, dass ich kurz davor bin. Es wirft immer wieder CthulhuRlyehWgahnaglFhtagnException s aus irgendeinem Grund, also werde ich es auf VB 6 portieren und die On Error Resume Next . Ich werde den Code aktualisieren, sobald ich diese seltsame Tür untersucht habe, die sich gerade in der Wand geöffnet hat. Hmm.

P.S. Pierre de Fermat hat auch herausgefunden, wie man das macht, aber der Rand, in den er schrieb, war nicht groß genug für den Code.

96 Stimmen

Die Division durch Null ist ein viel einfacheres Problem als die anderen von Ihnen genannten. Wenn Sie Intervalle und nicht die einfache Fließkommaarithmetik verwenden (was jeder tun sollte, aber niemand tut es), können Sie problemlos etwas durch [ein Intervall mit] Null dividieren. Das Ergebnis ist einfach ein Intervall, das plus und minus unendlich enthält.

2 Stimmen

@rjmunro Ich finde, dass die Verwendung von Intervallen für die Arithmetik etwas Geniales ist, aber ich habe das noch nie gesehen. Meinst du de.wikipedia.org/wiki/Intervall_arithmetisch ?

180 Stimmen

Das Fermat'sche Problem der kleinen Ränder wurde durch weiche Ränder in moderner Textverarbeitungssoftware gelöst.

1172voto

itsadok Punkte 27963

Haftungsausschluss : Verwenden Sie einen Parser, wenn Sie die Möglichkeit dazu haben. Davon abgesehen...

Dies ist die Regex, die ich verwende (!), um HTML-Tags abzugleichen:

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>

Er mag nicht perfekt sein, aber ich habe diesen Code durch ein lot von HTML. Beachten Sie, dass es sogar seltsame Dinge abfängt wie <a name="badgenerator""> die im Internet auftauchen.

Ich schätze, damit es nicht mit in sich geschlossenen Tags übereinstimmt, müssten Sie entweder Kobi Der negative Blick nach hinten:

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+(?<!/\s*)>

oder einfach kombinieren, wenn und wenn nicht.

An die Abwärtswähler: Dies ist ein funktionierender Code eines aktuellen Produkts. Ich bezweifle, dass irgendjemand, der diese Seite liest, den Eindruck bekommt, dass es gesellschaftlich akzeptabel ist, Regexe in HTML zu verwenden.

Caveat : Ich sollte anmerken, dass diese Regex immer noch bei CDATA-Blöcken, Kommentaren und Skript- und Stilelementen versagt. Die gute Nachricht ist, dass Sie diese mit einer Regex loswerden können...

123 Stimmen

Ich würde lieber etwas nehmen, das bei normalen Dingen funktioniert, als darüber zu weinen, dass es nicht universell perfekt ist :-)

23 Stimmen

Sie lösen also nicht wirklich das Parsing-Problem mit regexp allein, aber als Teil des Parsers kann dies funktionieren. PS: Ein funktionierendes Produkt bedeutet nicht gleich guten Code. Nichts für ungut, aber so arbeitet die industrielle Programmierung und bekommt ihr Geld

43 Stimmen

Ihre Regex beginnt bei der kürzest möglichen, gültigen HTML-Datei zu versagen: <!doctype html><title><</title> . Einfach '<!doctype html><title><</title>'.match(/<(?:"[^"]*"['"]*|'[^']*'['"]*|‌​[^'">])+>/g) gibt zurück. ["<!doctype html>", "<title>", "<</title>"] während sollte ["<title>", "</title>"] .

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