preg_match_all() mit wiederholung
Andreas Jacob
- php
Hallo zusammen!
ich habe (mal wieder) ein kleines Problem mit der preg_match function. Ich habe einen String aus einer Datei ausgelesen, die einen xml-ähnlichen Aufbau hat. In dieser Datei befinden sich Konfigurationsdaten für mehrere Projekte. Diese sehen (gekürzt) so aus:
<PROJECT id="1">Config für Projekt 1</PROJECT><PROJECT id="2">Config für Projekt 1</PROJECT>.......
Ich möchte nun mit für jedes Project die id="" auslesen und alles was innerhalb der beiden Tags steht. So in etwa:
$values[0][1] = "1";
$values[0][2] = "Config für Projekt 1";
$values[1][1] = "2";
$values[1][2] = "Config für Projekt 2";
Dazu verwende ich folgenden Ausdruck:
preg_match_all("/<project id="([\d+])">(.*)</project>/i", $cfgString, $values);
Leider erkennt dieser nicht, dass es sich bei obigen String um 2 Projekte handelt und gibt mir als Ergebnis:
$values[1] = "1";
$values[2] = "Config für Projekt 1</PROJECT><PROJECT id="2">Config für Projekt 1";
Hat jemand eine Idee wie das geht? Ist wahrscheinlich wieder total einfach, aber ich hab Tomaten vor den Augen.
Danke
Andreas
Moin!
Leider erkennt dieser nicht, dass es sich bei obigen String um 2 Projekte handelt und gibt mir als Ergebnis:
$values[1] = "1";
$values[2] = "Config für Projekt 1</PROJECT><PROJECT id="2">Config für Projekt 1";Hat jemand eine Idee wie das geht? Ist wahrscheinlich wieder total einfach, aber ich hab Tomaten vor den Augen.
Reguläre Ausdrücke sind gierig und nehmen soviel, wie sie kriegen können. In deinem String _kann_ man mehrere Projekteinträge finden, aber genausogut findet man auch nur einen einzigen, der etwas krasser ist.
".*" als regulärer Ausdruck findet soviele Zeichen, wie reinpassen. Wenn du also nicht ausschließt, dass das Endtag auch von ".*" erfaßt wird, weil dahinter noch ein weiteres Endtag existiert, dann kriegst du eben das vorhandene Ergebnis.
Lösung: ".*?" nehmen. Das Fragezeichen nimmt die Gierigkeit, es werden dann so wenig Zeichen, wie möglich, gefunden.
Oder nach "[^<]*" suchen lassen - alles, was kein "<" ist, weil < Tags eröffnet und zwischendurch maskiert werden müßte.
Oder du machst gleich richtige XML-Verarbeitung. Denn echtes XML kann man mit regulären Ausdrücken nicht so einfach erfassen.
- Sven Rautenberg