Matthias: preg_match zu gefrässig

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

  1. 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

    1. 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

      1. 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

        --
        Glaube niemals dem Gelabber der Forums-Antworten. Das sind doch Minderheiten-Diskriminierer, Sexisten, Psychisch Kranke und Depressive.
        Ja auch Rassisten und ähnliche Sozialrowdies befinden sich da drunter. - </archiv/2003/8/54855/#m305505>
        1. 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

          1. 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

            1. 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_>"

              1. 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