RegExp: Namen aus input-elementen auslesen

Martin Schroeder

Erfahrenes Mitglied
Hallo!
Ich möchte ein Script schreiben, dass die Namen der Formular-Objekte aus einer HTML-Datei zieht.
Ich habe eine regular expression geschrieben, die aber nicht so funktioniert, wie sie soll:
PHP:
$regexp='!<form*.*action=["\']bla.html["\'].*>.*(<(input|select) .*name=["\'](?P<param>.*)["\'].*>.*)*.*</form>!Uis';
    echo htmlentities($regexp);
    preg_match_all($regexp,$contents,$match);
(In $match['param'] sind dann alle Objektnamen gespeichert, die er findet.)
Sie findet entweder nur den Namen des ersten Objekts, oder des letzten, je nach dem, ob nach der Klammer um "<(input|select) .*......" ein "*" kommt. Das ist ja verständlich. Aber warum findet er mit "*" nur das letzte Vorkommen?
Kann mit jemand eine expression schreiben, die funktioniert?
Dafür wäre ich sehr dankbar;)
 
Wird nicht ganz einfach werden, da sich die Attribute bei FORM auch ändern können bzw. an anderen Stellen stehen könnten.

Irgenwie werde ich auch aus deinen Beispiel nicht schlau.

Code:
$regexp='!<form*.*action=["\']bla.html["\'].*>.*(<(input|select) .*name=["\'](?P<param>.*)["\'].*>.*)*.*</form>!Uis';

Gibt es ein Beispiel ?

Code:
$reg_1 = '<form.*?action=["\'](.*?)["\'].*?>';
$reg_2 = '<(?:input|select).*?name=["\'](.*?)["\'].*?>';
$regex = '/.'$reg_1.$reg_2.'/is';
(ungetestet)
 
Die expression soll alle namen der input- und select-Felder innerhalb eines Formulars mit einer bestimmten action finden.
Beispiel:
Code:
<form action="index.php" method="post">
Ganz viel Text
<input type="text" name="input1">
Noch ein bisschen Text
<input type="text" name="input2">
<input type="text" name="input3">
</form>
<form action="index2.php" method="post">
Ganz viel Text
<input type="text" name="input4">
Noch ein bisschen Text
<input type="text" name="input5">
<input type="text" name="input6">
</form>

Die expression soll nun also alle Namen im Formular mit der action="index.php" finden, also input1, input2, input3.
Das andere Formular soll ignoriert werden.
Deshalb:
Code:
<form*.*action=["']index.php["'].*>[...]</form>
Und um den Namen eines Formularelements zu extrahieren, nehme ich:
Code:
<(input|select) .*name=["'](?P<param>.*)["'].*>
param ist ein Bezeichner für den gefundenen String, damit ich keine Nummer verwenden muss.

Jetzt ist mein Problem, dass er halt nicht alle Formularobjektnamen findet, sondern nur einen.

Was muss ich verändern, damit er alle findet?
 
> param ist ein Bezeichner
Verstehe ich jetzt nicht, wie du das meinst ...
Siehe: http://regexp-evaluator.de/tutorial/unterausdruecke/
Unter "Namentliche Bezeichnung von Unterausdrücken"
Was gelernt?;)

Ich werde die Aufgabe einfach in zwei Schritte teilen.
  1. Herausbekommen des Inhalts des form-Elements mit der spezifizierten action
  2. Herausbekommen der Namen der input- und select-Elemente

Ich hätte jetzt aber gedacht, dass das auch relativ einfach mit RegEx ginge. Naja... :)
 
Zurück