preg_match zu gefrässig
Matthias
- php
Hallo,
ich habe ein Template, das geparsed wird mit (gekürzt):
<ERRORMESSAGE_1>
[MESSAGE_1]
</ERRORMESSAGE>
viel Text, viel Text, viel Text, viel Text,
viel Text, viel Text, viel Text, viel Text
<ERRORMESSAGE_2>
[MESSAGE_2]
</ERRORMESSAGE>
beide Fehlertags inkl. "MESSAGE_" sollen entfernt werden, wenn kein Fehler vorliegt.
nun habe ich in der php-Datei den Code:
preg_match("/<ERRORMESSAGE([\w,\W]*)</ERRORMESSAGE>/",$output,$all_match)){
$output = str_replace($all_match[0],"",$output);
Damit, so dachte ich bekäme ich alles zwischen den Tags weg (Tags inklusive), aber es wird alles zwischen "<ERRORMESSAGE_1>" und dem LETZEN "</ERRORMESSAGE>" gelöscht - eben auch der "viel Text".
Habe in div. Quellen was von (.*?) gelesen und in einigen Variationen darauf angewandt - hat aber nicht geklappt. Bin ratlos.
Vielen Dank für Hilfe
Matthias
Hallo Matthias,
preg_match("/<ERRORMESSAGE([\w,\W]*)</ERRORMESSAGE>/",$output,$all_match)){
$output = str_replace($all_match[0],"",$output);Damit, so dachte ich bekäme ich alles zwischen den Tags weg
Kleine Frage: warum nicht preg_replace?
$output = preg_replace ("/<ERRORMESSAGE>(.*?)</ERRORMESSAGE>/", "", $output);
Habe in div. Quellen was von (.*?) gelesen und in einigen Variationen darauf angewandt - hat aber nicht geklappt.
Wenn Du uns die Variantionen nicht zeigst können wir Dir auch nicht sagen, was falsch ist.
Viele Grüße,
Christian
Hallo Christian,
Kleine Frage: warum nicht preg_replace?
prinzipiell kein Problem damit ...
$output = preg_replace ("/<ERRORMESSAGE>(.*?)</ERRORMESSAGE>/", "", $output);
aber das funktioniert ebenso wenig. Davon abgesehen, mit (.*?) bekommt man leider nicht den und den Carriage Return (\r) => das garnichts gematched wird.
Wenn Du uns die Variantionen nicht zeigst können wir Dir auch nicht sagen, was falsch ist.
schon wahr..
meine Versuche waren:
"/(<ERRORMESSAGE([\w,\W]*)</ERRORMESSAGE>)?/"
"/(<ERRORMESSAGE([\w,\W]*)</ERRORMESSAGE>){1}/"
//mit dem ? oder {1} sollte eigentlich nur einmal gematched werden
und noch sinnfreiere...
aber preg_match geht immer bis zum letzten Vorkommen von "</ERRORMESSAGE>" - soll aber beim ersten schon stoppen.
Viele Grüsse Matthias
Hallo Matthias,
$output = preg_replace ("/<ERRORMESSAGE>(.*?)</ERRORMESSAGE>/", "", $output);
aber das funktioniert ebenso wenig. Davon abgesehen, mit (.*?) bekommt man leider nicht den und den Carriage Return (\r) => das garnichts gematched wird.
Hmmm, klar..... der m-Modifier fehlt:
$output = preg_replace ("/<ERRORMESSAGE>(.*?)</ERRORMESSAGE>/m", "", $output);
Sonst geht das nicht über mehrere Zeilen. Hatte ich vergessen.
"/(<ERRORMESSAGE([\w,\W]*)</ERRORMESSAGE>)?/"
"/(<ERRORMESSAGE([\w,\W]*)</ERRORMESSAGE>){1}/"
Du hast das falsch verstanden; richtig wäre:
"/<ERRORMESSAGE([\w,\W]*?)</ERRORMESSAGE>/"
Das ?-Zeichen hat zwei Bedeutungen: Direkt nach einem Zeichen oder Klammer-Ausdruck meint es, dass dieses Zeichen oder dieser Klammer-Ausdruck keinmal oder einmal vorkommen dürfen. Wenn es jedoch hinter einem * oder + steht, dann modifiziert es * oder +, damit diese nicht gierig sind.
Viele Grüße,
Christian
Hallo Christian,
Hmmm, klar..... der m-Modifier fehlt:
$output = preg_replace ("/<ERRORMESSAGE>(.*?)</ERRORMESSAGE>/m", "", $output);
Habs exakt übernommen -> matched nun gar nicht, hmm...
(Aber da sind ja auch Tabulatoren drin)
Das ?-Zeichen hat zwei Bedeutungen: Direkt nach einem Zeichen oder Klammer-Ausdruck meint es, dass dieses Zeichen oder dieser Klammer-Ausdruck keinmal oder einmal vorkommen dürfen. Wenn es jedoch hinter einem * oder + steht, dann modifiziert es * oder +, damit diese nicht gierig sind.
Na ja, preg_replace() oder auch preg_match() giert immer noch bis zum letzten. Muss ich wohl ganz anders machen...
Bis denne Matthias
Hallo nochmal,
$output = preg_replace ("/<ERRORMESSAGE>(.*?)</ERRORMESSAGE>/m", "", $output);
Habs exakt übernommen -> matched nun gar nicht, hmm...
Irgendwie bin ich heute nicht ganz konzentriert, denn:
1. Habe ich Dein erstes Posting nicht richtig gelesen und ging davon aus, dass der Starttag immer <ERRORMESSAGE> ist; in wirklichkeit ist er aber <ERRORMESSAGE_X>
2. Es muss natürlich der s-Modifier sein.
Dieser Regexp klappt: "/<ERRORMESSAGE(.*?)</ERRORMESSAGE>/s" (getestet)
Sorry nochmal...
Viele Grüße,
Christian
Hallo,
Irgendwie bin ich heute nicht ganz konzentriert, denn:
mittlerweile ich auch nicht mehr...
in wirklichkeit ist er aber <ERRORMESSAGE_X>
ja, das X ist in Wirklichkeit dann der Fehlertyp, der ausgewertet wird, wenn ein (oder mehrere) Fehler vorliegen.(Login-Fehler, Required-value-Fehler, etc.). Das sieht dann so ähnlich aus:
"<ERRORMESSAGE_failed-login_>"
- Es muss natürlich der s-Modifier sein.
Dieser Regexp klappt: "/<ERRORMESSAGE(.*?)</ERRORMESSAGE>/s" (getestet)
schön, wenn das klappt, werde ich aber erst morgen testen.
Viele Grüße und Danke,
Matthias