Regular Expressions
-
Grüß Gott Kollegen,
Ich habe mich mit Regulären Ausdrücken noch überhaupt nicht beschäftigt, doch ich denke fast, dass ich das jetzt muss:
Folgendes Problem:<form method="POST" action="index.php">
<input type="text" name="textinput">
<input type="submit" name="submit">
</form>In einer variable steht HTML Quellcode. Dieser kann mehrere Forms enthalten.
Die Variable ist definiert als:char buffer[5000];
Ich will nun den buffer auslesen und folgende Dinger aus dem HTML Quellcode auslesen:
var[0] = "POST";
var[1] = "index.php";
var[2] = "textinput";
var[3] = "submit";Sollte es mehrere <input type="text"....> in einer Form geben sollten alle eingelesen werden.
vor diesem Problem stehe ich jetzt also...
Danke für eure Hilfen
-
Hi!
Ich kann dir boost ans Herz legen. Boost hat eine RegEx-Engine. Aber warscheinlich gibt es noch mehr, wenn du im Internet danach suchts.
Die RegEx Selber kannst du mit PERL oder AWK testen bzw. entwickeln. Diese kannst du dann (mit geringem Aufwand) 1 zu 1 in BOOST verwenden.mfg bauerb
-
Hmm
Wäre auch eine Lösung ohne RegEX denkbar?
-
Hi!
Ja klar. Du kannst das ganze auch manuel rausparsen. Allerdings ist das der 10-Fache Aufwand und viel Fehleranfälliger.
Würd ich dir eher nicht empfehlen.mfg bauerb
-
bauerb schrieb:
Ja klar. Du kannst das ganze auch manuel rausparsen. Allerdings ist das der 10-Fache Aufwand und viel Fehleranfälliger.
Würd ich dir eher nicht empfehlen.Öh, Regex sind eher fehleranfälliger. ymmv
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Linux/Unix in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hi!
Naja... Ich hatte bis jetzt keine Probleme damit. Klar.. Man braucht eine gewisse Zeit sich einzuarbeiten, aber dann...
mfg bauerb
-
Hiiiilfeeee....
Also hat wer einen "manuellen Ansatz"?
Danke
-
Das Problem ist halt, dass du oft ziemlich viele Grenzfälle hast. Gerade HTML ist ja sehr flexibel. Alle Fälle richtig zu beachten kann ganz schön aufwendig werden. Da ist ein Parser natürlich besser. Aber auch aufwendiger.
-
Bei variabler Eingabe ist eine Normalisierung auch obligatorisch. Ein einfaches s/\s+/ /mg kann schon Wunder wirken. Dann holt man sich das interessante Tag und extrahiert die Attribute, so dass deren Reihenfolge auch egal ist. Groß/kleinschreibung ignorieren ist ohnehin trivial.
-
Hi!
Das ist ein ähnliches Problem, wie ich es mit dem Auslesen der HTTP-Header hatte - das war in ca. 2 Tagen (inklusive Tests, welcher Code am schnellsten parst) sehr gut lösbar. Wenn du nur bestimmte Tags so auslesen willst wie im konkreten Beispiel beschrieben, kannst du das auch ohne reguläre Ausdrücke schnell und fehlerunanfällig programmieren.
Um HTML-Code grundsätzlich zu parsen, kann man einfach folgendermaßen vorgehen: Nach der öffnenden Klammer (ich prüfe immer, ob evt. Leerzeichen dazwischen gerutscht sind und überlese diese) hat man gleich den HTML-"Befehl", der bis zum nächsten Leerzeichen geht. Ich denke, man könnte nun von Tag zu Tag gehen, den vorne stehenden "Befehl" darin auslesen und dann nach Befehlen verzweigen. In den Zweigen wird der jeweilige Tag bis zur schließenden Klammer geparst. Die einzelnen Attribute im HTML-Tag sind durch mindestens ein Leerzeichen voneinander getrennt (immer damit rechnen, dass statt 1 Leerzeichen auch mal 2 oder mehr Leerzeichen stehen, die man dann überliest), Anführungszeichen können als ein Strich oder Doppelstrich geschrieben sein, eigentlich kann man sie meistens überlesen (mir fällt jetzt zumindest kein Beispiel ein, in dem man das nicht könnte). Im jeweiligen Zweig liest du dann die einzelnen Attribute aus der Zeile aus und wertest sie aus.
Ob der Code schneller ist als reguäre Ausdrücke, muss man testen, ich würds manuell machen. Es hängt sicher auch davon ab, wie der Code programmiert ist, ob du mit Stringfunktionen oder mit Chararrays arbeitest, ob du effektive Methoden wählst usw. (buffer[a] ist z.B. immer schneller als buffer.substr(a,1) usw.), man kann ja die jeweiligen Parse-Zeiten testen und die schnellste Methode übernehmen.
Viele Grüße