Mr.Luke: preg_match_all - Fehler in Expression (PHP)?!

Mahlzeit!

Ich brauche eure Hilfe, da meine "preg_match_all" Funktion nicht so will... wie ich will :]

Hier der Code...
preg_match_all("#{if[start]}(.*?){if[ende]#", $String, $Array);

Der Sinn...
Ich möchte eine Art Abfrage in einem Template erstellen, welche dann denn Inhalt zwischen "{if[start]}" und "{if[ende]}" sucht?!

Leider klappt das bei dieser Expression icht. Ich denke es liegt an den Sonderzeichen {} oder [], aber auch wenn ich diese mit \ maskiere dann funktioniert es nicht :(

Bitte um Hilfe?!

Gruß,
Mr. Luke

  1. Hi,

    Leider klappt das bei dieser Expression icht. Ich denke es liegt an den Sonderzeichen {} oder [],

    exakt.

    aber auch wenn ich diese mit \ maskiere dann funktioniert es nicht :(

    Du bringst Zeichen wie "[" oder "{" in einen RegExp-Kontext, musst sie also RegExp-spezifisch kodieren. Das hast Du fast vollständig durchgeführt. Anschließend bringst Du diese RegExp in den String-Kontext, musst sie also String-spezifisch kodieren. Und in Zukunft vergiss bitte nicht die Fehlerbeschreibung - "funktioniert nicht" war noch nie eine und wird auch niemals eine sein.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Danke!

      Die korrigierte Fehlerbeschreibung: Maskierung in Regulär Expressions fehlerhaft. :)

      Leider hat die Maskierung nicht funktioniert, d.h. ich erhalte immer ein leeres Array.

      Hier die korrigierte Funktion ....
      preg_match_all("#{if[start]}(.*?){if[ende]}#", $String, $Array);

      Hier ein Ausschnitt aus dem HTML Template ...
      {if[start]}
        <tr>
          <td class="title">{object_area_lbl}</td>
          <td class="text">{object_area_val}</td>
        </tr>
      {if[ende]}

      Kann es damit zusammenhängen, dass im (.*?) Teil auch noch weitere Platzhalter existieren? Diese werden mit einem einfachen str_replace() mit Informationen ersetzt.

      Gruß,
      Mr. Luke

      Hi,

      Leider klappt das bei dieser Expression icht. Ich denke es liegt an den Sonderzeichen {} oder [],

      exakt.

      aber auch wenn ich diese mit \ maskiere dann funktioniert es nicht :(

      Du bringst Zeichen wie "[" oder "{" in einen RegExp-Kontext, musst sie also RegExp-spezifisch kodieren. Das hast Du fast vollständig durchgeführt. Anschließend bringst Du diese RegExp in den String-Kontext, musst sie also String-spezifisch kodieren. Und in Zukunft vergiss bitte nicht die Fehlerbeschreibung - "funktioniert nicht" war noch nie eine und wird auch niemals eine sein.

      Cheatah

      1. Manchmal ist es einfacher als man denkt.
        Zu . gehört standardmäßig nicht der Zeilenumbruch.
        Einfach den Modifier s hinzuüfgen. So werden auch Zeilenumbrüche als . erkannt.

        preg_match_all("#{if[start]}(.*?){if[ende]}#s", $String, $Array);

        Grüße aus dem Wald
        Voodoo

        1. Manchmal hilf auch einfach etwas "Voodoo" :)

          Vielen Dank... es funktioniert und ich bin jetzt ne Lachnummer im Team - Gott bin ich blöde!!!

          Gruß,
          Mr. Luke

          Manchmal ist es einfacher als man denkt.
          Zu . gehört standardmäßig nicht der Zeilenumbruch.
          Einfach den Modifier s hinzuüfgen. So werden auch Zeilenumbrüche als . erkannt.

          preg_match_all("#{if[start]}(.*?){if[ende]}#s", $String, $Array);

          Grüße aus dem Wald
          Voodoo

          1. @@Mr.Luke:

            Vielen Dank... es funktioniert und ich bin jetzt ne Lachnummer im Team - Gott bin ich blöde!!!

            Lektüre von http://de.wikipedia.org/wiki/TOFU macht dich schlauer. ;-)

            Live long and prosper,
            Gunnar

            --
            „Das Internet ist ein großer Misthaufen, in dem man allerdings auch kleine Schätze und Perlen finden kann.“ (Joseph Weizenbaum)
    2. gudn tach!

      Leider klappt das bei dieser Expression icht. Ich denke es liegt an den Sonderzeichen {} oder [],

      exakt.

      noe, es lag nur am fehlenden 's', das maskieren war nicht falsch; siehe https://forum.selfhtml.org/?t=165361&m=1078247.

      Du bringst Zeichen wie "[" oder "{" in einen RegExp-Kontext, musst sie also RegExp-spezifisch kodieren. Das hast Du fast vollständig durchgeführt. Anschließend bringst Du diese RegExp in den String-Kontext, musst sie also String-spezifisch kodieren.

      grundsaetzlich stimmt das zwar, hat aber nix mit dem OP-problem zu tun.

      ich sag's bloss fuer's archiv.

      prost
      seth

  2. Hi,

    Hier der Code...
    preg_match_all("#{if[start]}(.*?){if[ende]#", $String, $Array);

    nach { muß die Anzahl der gewünschten Vorkommen stehen, also #{1} für genau eins, #{,7} für maximal 7, #{2,4} für 2 bis 4 #-Zeichen.

    Wenn Du ein explizites { suchen willst, mußt Du es wie die [] escapen.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. gudn tach!

      Hier der Code...
      preg_match_all("#{if[start]}(.*?){if[ende]#", $String, $Array);

      nach { muß die Anzahl der gewünschten Vorkommen stehen, also #{1} für genau eins, #{,7} für maximal 7, #{2,4} für 2 bis 4 #-Zeichen.

      nein.
      1. # ist hier delimiter
      2. php denkt hier mit und versteht die braces hier literal.

      zu 2.: ich weiss allerdings nicht, ob dies vor php 5.2 auch schon so war.

      Wenn Du ein explizites { suchen willst, mußt Du es wie die [] escapen.

      noe, muss man nicht. und man muss noch nicht mal immer die brackets escapen.

      der regexp '#{if[start]}(.*?){if[ende]}#s'
      macht das gleiche wie '/{if[start]}(.*?){if[ende]}/s'

      prost
      seth