Reguläre Ausdrücke...
Sebastian
- php
Hallo zusammen,
ich habe folgendes Problem. Ich möchte mit Hilfe der Funktion preg_match_all Zeichenketten auftrennen und mit Hilfe von Klammerungen in einem Array speichern.
Die Zeichenketten haben folgende Gestalt:
<nixtag></nixtag><tag1><tag2>blablabla</tag2><tag3>blablabla</tag3></tag1><tag1>....</tag1>
Nun möchte ich, dass mir PHP diese folgendermaßen auftrennt, wobei der name "tag1" bekannt ist:
array[0] = <tag1><tag2>blablabla</tag2><tag3>blablabla</tag3></tag1>
array[1] = <tag1>...</tag1>
usw.
Wie muss der dazugehörige reguläre Ausdruck aussehen:
Mein erster Ansatz sah folgendermaßen aus: "/<tag1>([^(tag1)].*)</tag1>/"
Jedoch sah das Ergebnis in diesem Fall immer so aus:
array[0] = <tag1><tag2>blablabla</tag2><tag3>blablabla</tag3></tag1><tag1>....</tag1>
Danke schon mal im voraus für eure Unterstützung!
Hallo,
wenn nicht zwangsweise RegEx verwendet werden müssen, würde ich auf explode zurückgreifen. Das heisst, man teilt den String anhand von "<tag1>" und entfernt aus dem Reststring die dort am anfang auftauchenden "</tag1>". Wenn gewünscht, werden diese natürlich wieder am Ende ergänzt, sodass die Arrayelemnte schliesslich den vollständigen Tag enthalten.
Mit freundlichen Grüßen, Lucas
Das Schöne an dem regulären Ausdruck wäre, dass ich diesen wiederum benutzen könnte, um die Teil weiteren Teilstrings aufzuspalten...
Mit xml_parse ist der Aufwand zu groß und es ergibt auch keinen Sinn, da die xml-Datei Werte beinhaltet, an denen ich interessiert bin und nicht die Struktur selbst...
Hallo,
Das Schöne an dem regulären Ausdruck wäre, dass ich diesen wiederum benutzen könnte, um die Teil weiteren Teilstrings aufzuspalten...
du kannst doch das gleiche Prinzip auch für alles darunter verschaltete verwenden?! Klar, dann muss "<tag1>" durch "<tag2>" etc ersetzt werden, aber das sollte möglich sein. Oder habe ich da was falsch verstanden?
Mit freundlichen Grüßen, Lucas
Ja es wäre natürlich auch über diesen Weg möglich, die Datei aufzusplitten und an die Daten ranzukommen, doch wäre es einfacher und eleganter über regulären Ausdrücke, da ich weniger die Reihenfolge der einzelnen Tags beachten müsste... usw.
Falls Dir oder einem weiteren Forenbesucher ein entsprechender regulärer Ausdruck einfallen sollte, welcher das im ersten Posting genannte Problem löst, darfst Du dich / darf er sich gerne dazu berufen fühlen, diesen hier reinzuschreiben.
Hallo Sebastian,
<nixtag></nixtag><tag1><tag2>blablabla</tag2><tag3>blablabla</tag3></tag1><tag1>....</tag1>
das ist ggf. eher was für einen xml-Parser ...
Wie muss der dazugehörige reguläre Ausdruck aussehen:
versuch es mal mit:
"~<tag1>.*</tag1>~U"
eine Klammerung brauchst du eigenltich nicht, da php den Gesammttreffer sowieso speichert.
Mein erster Ansatz sah folgendermaßen aus: "/<tag1>([^(tag1)].*)</tag1>/"
Was willst du denn mit ([^(tag1)].*) bezwecken? Dein Ausdruck sucht das was zwischen <tag1> und </tag1> steht und was nicht mit einem der Zeichen aus der Zeichenmenge »()tag1« anfängt und von beliebigen Zeichen (außer Zeilenumbrüchen) gefolgt wird. Auf deine obengenannte Zeichenkette trifft das zwar zu (das erste Zeichen nach <tag1> ist ein <) - aber wenn du vor <tag2> z.B. ein »t« schreibst, wird der erste <tag1>-Block nicht mehr gefunden. Ich glaube nicht, dass das das ist, was du willst :-)
Noch ein Tipp: als Delimiter kannst du auch andere Zeichen als / verwenden - dann musst du das / von </tag1> nicht maskieren.
array[0] = <tag1><tag2>blablabla</tag2><tag3>blablabla</tag3></tag1><tag1>....</tag1>
der Punkt ist zu http://de.selfhtml.org/cgiperl/sprache/regexpr.htm#gierig_genuegsam@title=gierig ist - setzt mal hinter den Stern ein Fragezeichen oder ganz ans Ende (hinter das abschließende /) ein »U«.
Grüße aus Nürnberg
Tobias [der hofft, dass das jetzt nicht allzu unverständlich war ...]
Wow, Kreuzchen gut gesetzt und damit Schiff versenkt... ...im übertragenen Sinne!
Falls es noch jemanden interessiert, wie das ganze in PHP-Sysntax dann vollkommen aussieht:
preg_match("/<tag1>.*</tag1>/U",$string,$array);
In diesem Sinne noch eine gute Nacht!