Ich versuche, <input>
mit diesem Muster "versteckte" Felder vom Typ abzugleichen:
/<input type="hidden" name="([^"]*?)" value="([^"]*?)" />/
Dies sind Beispielformulardaten:
<input type="hidden" name="SaveRequired" value="False" /><input type="hidden" name="__VIEWSTATE1" value="1H4sIAAtzrkX7QfL5VEGj6nGi+nP" /><input type="hidden" name="__VIEWSTATE2" value="0351118MK" /><input type="hidden" name="__VIEWSTATE3" value="ZVVV91yjY" /><input type="hidden" name="__VIEWSTATE0" value="3" /><input type="hidden" name="__VIEWSTATE" value="" /><input type="hidden" name="__VIEWSTATE" value="" />
Aber ich bin nicht sicher , dass das type
, name
und value
Attribute werden immer in der gleichen Reihenfolge erscheinen. Wenn das type
Attribut das letzte ist, schlägt die Übereinstimmung fehl, da es in meinem Muster am Anfang steht.
Frage:
Wie kann ich mein Muster so ändern, dass es unabhängig von der Position der Attribute im <input>
Tag übereinstimmt ?
PS: Übrigens verwende ich das auf Adobe Air basierende RegEx Desktop Tool zum Testen regulärer Ausdrücke.
Antworten:
Im Gegensatz zu allen Antworten hier ist das, was Sie versuchen, Regex zu machen, eine vollkommen gültige Lösung. Dies liegt daran, dass Sie NICHT versuchen, ausgeglichene Tags abzugleichen - DAS wäre mit Regex unmöglich! Aber Sie stimmen nur mit dem überein, was in einem Tag enthalten ist, und das ist vollkommen normal.
Hier ist jedoch das Problem. Sie können es nicht mit nur einem regulären Ausdruck tun ... Sie müssen ein Match durchführen, um ein
<input>
Tag zu erfassen , und dann die weitere Verarbeitung durchführen. Beachten Sie, dass dies nur funktioniert, wenn keiner der Attributwerte ein>
Zeichen enthält. Es ist also nicht perfekt, sollte aber für vernünftige Eingaben ausreichen.Hier ist ein Perl (Pseudo) Code, der Ihnen zeigt, was ich meine:
Das Grundprinzip hier ist, nicht zu viel mit einem regulären Ausdruck zu tun. Wie Sie bemerkt haben, erzwingen reguläre Ausdrücke eine bestimmte Reihenfolge. Stattdessen müssen Sie also zuerst den KONTEXT des zu extrahierenden Objekts abgleichen und dann die gewünschten Daten submatching.
BEARBEITEN: Ich werde jedoch zustimmen, dass die Verwendung eines HTML-Parsers im Allgemeinen wahrscheinlich einfacher und besser ist und Sie wirklich in Betracht ziehen sollten, Ihren Code neu zu gestalten oder Ihre Ziele zu überprüfen. :-) Aber ich musste diese Antwort posten, um der Reaktion zu widersprechen, dass das Parsen einer Teilmenge von HTML unmöglich ist: HTML und XML sind beide unregelmäßig, wenn man die gesamte Spezifikation betrachtet, aber die Spezifikation eines Tags ist anständig regelmäßig , sicherlich in der Macht von PCRE.
quelle
Oh ja, Sie können Regexes verwenden, um HTML zu analysieren!
Für die Aufgabe, die Sie versuchen, sind Regexes vollkommen in Ordnung!
Es ist wahr, dass die meisten Leute die Schwierigkeit, HTML mit regulären Ausdrücken zu analysieren, unterschätzen und dies daher schlecht tun.
Dies ist jedoch kein grundlegender Fehler im Zusammenhang mit der Computertheorie. Diese Albernheit wird hier viel nachgeahmt , aber glauben Sie ihnen nicht.
Obwohl dies sicherlich möglich ist (dieses Posting dient als Existenzbeweis für diese unbestreitbare Tatsache), heißt das nicht, dass es so sein sollte.
Sie müssen selbst entscheiden, ob Sie in der Lage sind, aus regulären Ausdrücken einen dedizierten, speziellen HTML-Parser zu schreiben. Die meisten Menschen sind es nicht.
Aber ich bin es. ☻
Allgemeine Regex-basierte HTML-Parsing-Lösungen
Zuerst werde ich zeigen, wie einfach es ist, beliebigen HTML-Code mit regulären Ausdrücken zu analysieren . Das vollständige Programm finden Sie am Ende dieses Beitrags, aber das Herzstück des Parsers ist:
Sehen Sie, wie einfach das zu lesen ist?
Wie geschrieben, identifiziert es jedes Stück HTML und sagt, wo es dieses Stück gefunden hat. Sie können es leicht modifizieren, um mit einem bestimmten Stücktyp oder für bestimmte Typen als diese zu tun, was Sie wollen.
Ich habe keine fehlgeschlagenen Testfälle (links :): Ich habe diesen Code erfolgreich auf mehr als 100.000 HTML-Dateien ausgeführt - jede einzelne konnte ich schnell und einfach in die Hände bekommen. Darüber hinaus habe ich es auch für Dateien ausgeführt, die speziell dafür entwickelt wurden, naive Parser zu brechen.
Dies ist kein naiver Parser.
Oh, ich bin sicher, dass es nicht perfekt ist, aber ich habe es noch nicht geschafft, es zu brechen. Ich denke, selbst wenn etwas passieren würde, wäre das Update aufgrund der klaren Struktur des Programms leicht zu integrieren. Sogar Regex-schwere Programme sollten strukturiert sein.
Lassen Sie mich nun, da dies nicht möglich ist, auf die Frage des OP eingehen.
Demo zur Lösung der Aufgabe des OP mithilfe von Regexes
Das kleine
html_input_rx
Programm, das ich unten einbinde, erzeugt die folgende Ausgabe, sodass Sie sehen können, dass das Parsen von HTML mit regulären Ausdrücken für das, was Sie tun möchten, einwandfrei funktioniert:Analysieren Sie Eingabe-Tags, siehe Keine bösen Eingaben
Hier ist die Quelle für das Programm, das die obige Ausgabe erzeugt hat.
Los geht's! Nichts dazu! :) :)
Nur Sie können beurteilen, ob Ihre Fähigkeiten mit regulären Ausdrücken einer bestimmten Analyseaufgabe gewachsen sind. Jeder hat ein anderes Können und jede neue Aufgabe ist anders. Für Jobs, bei denen Sie einen genau definierten Eingabesatz haben, sind reguläre Ausdrücke offensichtlich die richtige Wahl, da es trivial ist, einige zusammenzustellen, wenn Sie eine eingeschränkte Teilmenge von HTML haben. Sogar Regex-Anfänger sollten diese Jobs mit Regexes erledigen. Alles andere ist übertrieben.
Jedoch , sobald die HTML weniger genagelt beginnen immer, wenn es in einer Weise zu verzweigen beginnt kann man nicht vorhersagen , aber die sind vollkommen legal, wenn Sie mehr verschiedene Arten von Dingen oder mit komplexeren Abhängigkeiten entsprechen haben, werden Sie irgendwann einen Punkt erreichen , wo Sie müssen härter arbeiten, um eine Lösung zu erzielen, die reguläre Ausdrücke verwendet, als wenn Sie eine Parsing-Klasse verwenden müssten. Wo dieser Break-Even-Punkt liegt, hängt wiederum von Ihrem eigenen Komfortniveau mit Regexen ab.
Also was soll ich tun?
Ich werde Ihnen nicht sagen, was Sie tun müssen oder was Sie nicht tun können. Ich denke das ist falsch. Ich möchte Ihnen nur die Möglichkeiten vorstellen, Ihre Augen ein wenig öffnen. Sie können wählen, was Sie tun möchten und wie Sie es tun möchten. Es gibt keine Absoluten - und niemand kennt Ihre eigene Situation so gut wie Sie selbst. Wenn etwas zu viel Arbeit zu sein scheint, ist es es vielleicht. Das Programmieren sollte Spaß machen , wissen Sie. Wenn nicht, machen Sie es möglicherweise falsch.
Man kann mein
html_input_rx
Programm auf eine beliebige Anzahl gültiger Arten betrachten. Eine davon ist, dass Sie tatsächlich HTML mit regulären Ausdrücken analysieren können . Aber ein anderer ist, dass es viel, viel, viel schwieriger ist, als fast jeder jemals denkt, dass es so ist. Dies kann leicht zu dem Schluss führen, dass mein Programm ein Beweis dafür ist, was Sie nicht tun sollten, weil es wirklich zu schwer ist.Dem werde ich nicht widersprechen. Wenn alles, was ich in meinem Programm mache, nach einem Studium für Sie keinen Sinn ergibt, sollten Sie sicherlich nicht versuchen, Regexes für diese Art von Aufgabe zu verwenden. Für spezifisches HTML sind reguläre Ausdrücke großartig, aber für generisches HTML sind sie gleichbedeutend mit Wahnsinn. Ich verwende ständig Parsing-Klassen, insbesondere wenn es sich um HTML handelt, das ich nicht selbst generiert habe.
Regexes optimal für kleine HTML-Analyseprobleme, pessimal für große
Selbst wenn mein Programm als Beispiel dafür dient, warum Sie keine regulären Ausdrücke zum Parsen von allgemeinem HTML verwenden sollten - was in Ordnung ist, weil ich es irgendwie so gemeint habe -, sollte es dennoch ein Augenöffner sein, damit mehr Menschen das schrecklich Gemeinsame brechen und böse, böse Angewohnheit, unlesbare, unstrukturierte und nicht wartbare Muster zu schreiben.
Muster müssen nicht hässlich sein und sie müssen nicht hart sein. Wenn Sie hässliche Muster erstellen, ist dies eine Reflexion über Sie, nicht über sie.
Phänomenal exquisite Regex-Sprache
Ich wurde gebeten, darauf hinzuweisen, dass meine professionelle Lösung für Ihr Problem in Perl geschrieben wurde. Bist du überrascht? Hast du es nicht bemerkt? Ist diese Offenbarung eine Bombe?
Es ist wahr, dass nicht alle anderen Tools und Programmiersprachen in Bezug auf Regexes so bequem, ausdrucksstark und leistungsstark sind wie Perl. Es gibt da draußen ein großes Spektrum, von denen einige besser geeignet sind als andere. Im Allgemeinen ist es einfacher, mit den Sprachen zu arbeiten, die reguläre Ausdrücke als Teil der Kernsprache und nicht als Bibliothek ausgedrückt haben. Ich habe nichts mit regulären Ausdrücken gemacht, was Sie beispielsweise in PCRE nicht tun könnten, obwohl Sie das Programm anders strukturieren würden, wenn Sie C verwenden würden.
Irgendwann werden andere Sprachen in Bezug auf reguläre Ausdrücke aufholen, wo Perl jetzt ist. Ich sage das, weil damals, als Perl anfing, niemand so etwas wie Perls Regexe hatte. Sagen Sie alles, was Sie möchten, aber hier hat Perl eindeutig gewonnen: Alle haben Perls Regexe kopiert, wenn auch in unterschiedlichen Stadien ihrer Entwicklung. Perl war Pionier bei fast (nicht allen, aber fast) allem, worauf Sie sich heute in modernen Mustern verlassen, unabhängig davon, welches Werkzeug oder welche Sprache Sie verwenden. Also werden die anderen irgendwann aufholen.
Aber sie werden nur aufholen, wo Perl irgendwann in der Vergangenheit war, so wie es jetzt ist. Alles schreitet voran. In regulären Ausdrücken, wenn nichts anderes, wohin Perl führt, folgen andere. Wo wird Perl sein, wenn alle anderen endlich aufholen, wo Perl jetzt ist? Ich habe keine Ahnung, aber ich weiß, dass auch wir umgezogen sein werden. Wahrscheinlich sind wir näher an Perls Art, Muster herzustellen .
Wenn Sie so etwas mögen, es aber in Perl₅ verwenden möchten, könnte Sie Damian Conways wundervolles Regexp :: Grammars- Modul interessieren . Es ist absolut fantastisch und lässt das, was ich hier in meinem Programm getan habe, genauso primitiv erscheinen wie meine Muster, die Menschen ohne Leerzeichen oder alphabetische Bezeichner zusammenpressen. Hör zu!
Einfacher HTML-Chunker
Hier ist die vollständige Quelle für den Parser, von dem ich das Herzstück zu Beginn dieses Beitrags gezeigt habe.
Ich schlage nicht vor , dass Sie dies für eine streng getestete Parsing-Klasse verwenden sollten. Aber ich habe es satt, dass Leute so tun, als könne niemand HTML mit regulären Ausdrücken analysieren, nur weil sie es nicht können. Sie können es eindeutig, und dieses Programm ist ein Beweis für diese Behauptung.
Sicher, es ist nicht einfach, aber es ist möglich!
Und versucht , so zu tun , ist eine schreckliche Verschwendung von Zeit, weil gute Parsing Klassen existieren , die Sie sollten für diese Aufgabe verwenden. Die richtige Antwort für Leute, die versuchen, willkürliches HTML zu analysieren, ist nicht, dass es unmöglich ist. Das ist eine einfache und unaufrichtige Antwort. Die richtige und ehrliche Antwort ist, dass sie es nicht versuchen sollten, weil es zu mühsam ist, es von Grund auf neu herauszufinden. Sie sollten sich nicht den Rücken brechen, um ein Rad neu zu erfinden, das perfekt funktioniert.
Auf der anderen Seite ist HTML, das in eine vorhersehbare Teilmenge fällt, sehr einfach mit regulären Ausdrücken zu analysieren. Es ist kein Wunder, dass die Leute versuchen, sie zu benutzen, denn für kleine Probleme, Spielzeugprobleme, könnte nichts einfacher sein. Aus diesem Grund ist es so wichtig, die beiden Aufgaben - spezifisch und generisch - zu unterscheiden, da diese nicht unbedingt denselben Ansatz erfordern.
Ich hoffe, dass wir in Zukunft hier eine fairere und ehrlichere Behandlung von Fragen zu HTML und Regexes sehen können.
Hier ist mein HTML-Lexer. Es wird nicht versucht, eine validierende Analyse durchzuführen. es identifiziert nur die lexikalischen Elemente. Sie können sich das eher als HTML-Chunker als als HTML-Parser vorstellen . Es ist nicht sehr verzeihend für kaputtes HTML, obwohl es einige sehr kleine Zulassungen in diese Richtung zulässt.
Selbst wenn Sie niemals selbst vollständiges HTML analysieren (und warum sollten Sie das? Es ist ein gelöstes Problem!), Enthält dieses Programm viele coole Regex-Bits, von denen ich glaube, dass viele Leute viel lernen können. Genießen!
quelle
//input[@type="hidden"]
. Oder wenn Sie xpath nicht verwenden möchten, rufen Sie einfach alle Eingaben ab und filtern Sie, mit welchen versteckt werdengetAttribute
.Ich bevorzuge # 2.
Ergebnis:
quelle
Im Geiste der Lexer-Lösung von Tom Christiansen finden Sie hier einen Link zu Robert Camerons scheinbar vergessenem Artikel von 1998, REX: XML Shallow Parsing with Regular Expressions.
http://www.cs.sfu.ca/~cameron/REX.html
Wenn Sie gerne über reguläre Ausdrücke lesen, ist Camerons Artikel faszinierend. Sein Schreiben ist prägnant, gründlich und sehr detailliert. Er zeigt Ihnen nicht nur, wie Sie den regulären Ausdruck REX konstruieren, sondern auch einen Ansatz zum Aufbau komplexer Regex aus kleineren Teilen.
Ich benutze den regulären REX-Ausdruck seit 10 Jahren ein und aus, um das Problem zu lösen, nach dem das erste Poster gefragt hat (wie passe ich zu diesem bestimmten Tag, aber nicht zu einem anderen sehr ähnlichen Tag?). Ich habe festgestellt, dass der von ihm entwickelte Regex absolut zuverlässig ist.
REX ist besonders nützlich, wenn Sie sich auf lexikalische Details eines Dokuments konzentrieren, z. B. wenn Sie eine Art von Textdokument (z. B. Klartext, XML, SGML, HTML) in eine andere umwandeln, bei der das Dokument möglicherweise nicht gültig ist. gut geformt oder sogar für den größten Teil der Transformation analysierbar. Sie können Markup-Inseln an einer beliebigen Stelle innerhalb eines Dokuments anvisieren, ohne den Rest des Dokuments zu stören.
quelle
Obwohl ich den Inhalt der restlichen Antworten liebe, haben sie die Frage nicht direkt oder so richtig beantwortet. Selbst die Antwort von Platinum war zu kompliziert und auch weniger effizient. Also musste ich das sagen.
Ich bin ein großer Befürworter von Regex, wenn es richtig eingesetzt wird. Aufgrund von Stigmatisierung (und Leistung) sage ich jedoch immer, dass wohlgeformtes XML oder HTML einen XML-Parser verwenden sollte. Und eine noch bessere Leistung wäre das Parsen von Strings, obwohl es eine Grenze zwischen Lesbarkeit gibt, wenn dies zu außer Kontrolle gerät. Das ist jedoch nicht die Frage. Die Frage ist, wie ein Eingabe-Tag vom versteckten Typ abgeglichen werden kann. Die Antwort ist:
Abhängig von Ihrem Geschmack ist die einzige Regex-Option, die Sie einschließen müssen, die Option "Ignorieren".
quelle
<input type='hidden' name='Oh, <really>?' value='Try a real HTML parser instead.'>
>
im Namensfeld zu haben, so gut wie keine sind, ist es tatsächlich möglich, dass es ein>
in einem Aktionshandle gibt. EG: Ein Inline-Javascript-Aufruf für die OnClick-Eigenschaft. Davon abgesehen habe ich einen XML-Parser für diese, aber auch einen Regex für diejenigen, bei denen das mir gegebene Dokument für XML-Parser zu durcheinander ist, aber ein Regex kann. Darüber hinaus war dies nicht die Frage. Sie werden niemals mit versteckten Eingaben in diese Situationen geraten, und meine Antwort ist die beste.Ya, <really>!
./>
ist ein XML-Ismus; Es ist in keiner HTML-Version erforderlich, außer in XHTML (das nie wirklich an Zugkraft gewonnen hat und von HTML5 so gut wie abgelöst wurde). Und Sie haben Recht, dass es viele unordentliche, nicht wirklich gültige HTML-Dateien gibt, aber ein guter HTML- Parser ( nicht XML-Parser) sollte in der Lage sein, das meiste davon zu bewältigen. Wenn dies nicht der Fall ist, werden höchstwahrscheinlich auch keine Browser verwendet.Sie können dies versuchen:
und für ein genaueres Ergebnis können Sie dies versuchen:
Sie können Ihr Regex-Muster hier testen. http://regexpal.com/
Diese Patten sind gut dafür:
und für zufällige Reihenfolge von
type
,name
undvalue
u kann dies verwenden:oder
dazu:
`
Übrigens denke ich, dass Sie so etwas wollen:
Es ist nicht gut, aber es funktioniert in irgendeiner Weise.
Testen Sie es in: http://regexpal.com/
quelle
Ich möchte verwenden
**DOMDocument**
, um den HTML-Code zu extrahieren.Übrigens können Sie es hier testen - regex101.com. Es zeigt das Ergebnis in Echtzeit. Einige Regeln zu Regexp: http://www.eclipse.org/tptp/home/downloads/installguide/gla_42/ref/rregexp.html Reader .
quelle
Angenommen, Ihr HTML-Inhalt wird in der Zeichenfolge HTML gespeichert. Um alle Eingaben mit verstecktem Typ zu erhalten, können Sie reguläre Ausdrücke verwenden
Der obige Regex-Fund wird
<input
gefolgt von einer beliebigen Anzahl von Zeichen, bis er angezeigt wird,type="hidden"
oder geben Sie = 'hidden' ein, gefolgt von einer beliebigen Anzahl von Zeichen, bis er angezeigt wird>
/ g Weisen Sie den regulären Ausdruck an, jeden Teilstring zu finden, der dem angegebenen Muster entspricht.
quelle