2009-04-27 6 views
2

Ich versuche, einen regulären Ausdruck für meinen HTML-Parser zu schreiben.Wie schreibe ich einen regulären Ausdruck für HTML-Parsing?

Ich möchte eine HTML-Tag mit bestimmten Attribut (z. B. <div> mit class="tab news selected"), die eine oder mehrere <a href> Tags enthält übereinstimmen. Der Regexp sollte mit dem gesamten Tag übereinstimmen (von <div> bis </div>). Ich scheine immer "Gedächtnis-erschöpft" -Fehler zu bekommen - mein Programm nimmt wahrscheinlich jedes Etikett, das es als passendes finden kann.

Ich verwende Boost Regex-Bibliotheken.

+1

[Vorsicht vor Zalgo] (http://stackoverflow.com/a/1732454/135078) –

Antwort

7

Sie sollten sich wahrscheinlich this question re anschauen. Regexps und HTML. Das Wesentliche ist, dass die Verwendung von regulären Ausdrücken zum Parsen von HTML keineswegs eine ideale Lösung ist.

2

Wie andere gesagt haben, verwenden Sie keine Regexes, wenn überhaupt möglich. Wenn Ihr Code tatsächlich XHTML ist (d. H. Es ist auch wohlgeformtes XML), kann ich sowohl die Xerces als auch die Expat XML-Parser empfehlen, was Ihnen einen viel besseren Job als Regexes bietet. Sie

0

als flex tut: Spiel <div> mit Groß- und Kleinschreibung Spiel, und setzen Sie Ihren Parser in einem "-div matched" Zustand halten Eingangsverarbeitungs bis </div > und Reset-Zustand.

Dies dauert zwei Regexps und eine Statusvariable.

SGML gültige Zeichen sind [A-Za-z_:]

So:/< [A-Za-z _:] +>/entspricht einen Tag.

+0

Oder statt das Rad neu zu erfinden, einen vorhandenen Parser zu verwenden, der bereits geschrieben wurde und sich bereits mit Edge Cases befassen wird, und so weiter. –

1

Vielleicht sind Regexps nicht die beste Lösung, aber ich benutze bereits wie fünf verschiedene Bibliotheken und Boost funktioniert gut, wenn es darum geht, <a href> Tags und Schlüsselwörter zu finden.

Ich verwende diese regexps:

/<a[^\n]*/searched attribute/[^\n]*>[^\n]*</a>/ zum Lokalisieren <a href> Tags und:

/<a[^\n]*href[[^\n]*>/searched keyword/</a>/ zum Lokalisieren Links

(BTW kann es besser machen - ich regex saugen;))

Was ich jetzt brauche, ist die Suche nach Tags, die <a href> enthalten, und ich denke, Regexps werden alles gut machen - vielleicht muss ich meine eigene Parsing-Funktion schreiben, wie Piotr sagte.

+0

Es ist nicht so, dass reguläre Ausdrücke nicht die beste Lösung sind - für das, was Sie versuchen, ist regex überhaupt keine gültige Lösung *. Verwenden Sie stattdessen einen HTML- oder XML-Parser. –

+0

Ok, also welche empfehlen Sie. Ich würde ein leichtes bevorzugen;) –