Carole: Kleines Regex Problem

Ich versuche mit preg_match_all alle Vorkommen eines Strings in einen Array zu bekommen.

preg_match_all('/{var*}/', $text, $var, PREG_SET_ORDER);

Der String ist von der Form {var12321312423} oder {var890187361}

Also eigentlich sollte preg_match_all immer kucken ob etwas vorhanden ist, das so anfängt {var... und so aufhört ...} mit einer variablen Anzahl Zahlen dazwischen.
Leider funktioniert das nicht, also der Array ist leer. Was ich vor allem nicht weiss ist, wie ich mein Suchmuster überhaupt richtig formuliere, also mit / zu Beginn und Ende?

Danke für Eure Hilfe,
Carole.

  1. Hi Carole,

    preg_match_all('/{var*}/', $text, $var, PREG_SET_ORDER);

    Ein Sternchen bedeutet, dass das Zeichen oder die Zeichenklasse auf die es sich bezieht beliebig oft vorkommen darf (siehe PHP Manual), dein RegEx macht also so ziemlich alles von {va} bis {varrrrrrrrr} (und noch viel mehr).

    Für ein beliebiges Zeichen steht der Punkt - du könntest also .* statt nur dem Sternchen verwenden. Doch auch das würde nicht zum Ziel führen, da dann "{var123} {var456}" komplett durch $var ersetzt würde (der Punkt passt eben auch auf "} {" und RegEx sind standardmäßig gefräßig).

    Du musst also eine Zeichenklasse definieren, die alle Zeichen außer } enthält, das geht mit [^}] - alles in allem könnte es z.B. so aussehen:

    preg_match_all('/\{var[^\}]*\}/', $text, $var, PREG_SET_ORDER);

    Ich bin mir allerdings gerade nicht sicher, ob das escapen der geschwungenen Klammer innerhalb der Zeichenklasse notwendig ist, weil die Klammer dort eigentlich keine Sonderbedeutung hat...

    MfG, Dennis.

    1. Hallo Dennis

      Danke :) Es funktioniert, aber ich krieg die Werte in einem geschachtelten Array zurück, also $var[0][0] hat den ersten Wert, $var[0][1] den zweiten etc.
      Ist das per Definition so? Ist kein Problem, ich kann es auch so herausholen, ich hab es nur anders erwartet (aber habe ich eine Ahnung davon? Nein).

      In Ehrfucht dem RegExperten dankend,
      Carole :)

      1. Hi Carole,

        Es funktioniert, aber ich krieg die Werte in einem geschachtelten Array zurück, also $var[0][0] hat den ersten Wert, $var[0][1] den zweiten etc.
        Ist das per Definition so?

        Ja ist es (wie im übrigen auch im PHP Manual erklärt wird) - liegt ganz einfach daran, dass es einerseits ja mehrer Fundstellen geben kann (deshalb ja preg_match_ALL) und andererseits aber auch mehrere Sub-Ausdrücke, nach denen gesucht wurde, versuche mal folgendes:

        preg_match_all('/\{var([^\}]*)\}/', $text, $var, PREG_SET_ORDER);

        Und lass dir dann noch mal $var mit print_r() oder so ausgeben - dann wird es vielleicht verständlicher. Lass dir einfach sagen, dass man mehrer so eingeklammerte Stellen in einen regulären Ausdruck packen kann, je nach dem, was man haben will.

        MfG, Dennis.