Thomas: Regex: Doppelter Teil

Hallo,
beschäftige mich gerade mit zum erstem Mal mit Regular Expressions in PHP:
Ich habe eine Variable mit folgender Struktur als Inhalt:

$text="text {array:daten} hallo{/array:daten} vieltext";

Jetzt möchte ich alles, was zwischen den array:-Klammern steht auslesen:

preg_match_all("!{array:([a-zA-Z0-9]*)}(.*){/array:$1}!",$text,$list);

Problem an der Sache: Wie mache ich dem klar, das ich genau die Angaben will, bei denen hinter dem Doppelpunkt dasselbe steht. Bei einem ersetzen würde müsste es ja mit $1 gehen, wie es beim auslesen gehen soll, weiß ich nicht.

Für Hinweise wäre ich dankbar.

Thomas

  1. $text="text {array:daten} hallo{/array:daten} vieltext";
    Jetzt möchte ich alles, was zwischen den array:-Klammern steht auslesen:

    Problem an der Sache: Wie mache ich dem klar, das ich genau die Angaben will, bei denen hinter dem Doppelpunkt dasselbe steht. Bei einem ersetzen würde müsste es ja mit $1 gehen, wie es beim auslesen gehen soll, weiß ich nicht.

    preg_match_all("!{array:([a-zA-Z0-9]*)}(.*?){/array:\2}!",$text,$list);
                     $1     $2             $3 ^ $4      \2

    mit \2 statt $1 oder $2
    nimm .*? statt .*

    Wenn du einen Ausdruck nicht speichern willst, verwende
    (?: ) statt ()

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. Hi,

      preg_match_all("!{array:([a-zA-Z0-9]*)}(.*?){/array:\2}!",$text,$list);
                       $1     $2             $3 ^ $4      \2

      Wie kommst Du darauf, daß geschweifte Klammern capturing bewirken?

      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. preg_match_all("!{array:([a-zA-Z0-9]*)}(.*?){/array:\2}!",$text,$list);
                          $1     $2             $3 ^ $4      \2

        Wie kommst Du darauf, daß geschweifte Klammern capturing bewirken?

        Tja mit Glück zoome ich mal so weit hoch, dass ich den Unterschied sehe.

        Mal schauen, was ich gegen den beschissenen monospace font hier tun kann,

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
        1. Wie kommst Du darauf, daß geschweifte Klammern capturing bewirken?
          Tja mit Glück zoome ich mal so weit hoch, dass ich den Unterschied sehe.
          Mal schauen, was ich gegen den beschissenen monospace font hier tun kann,

          Ich habe jetzt die CSS Regel gesetzt
          #nachrichten-text{font-family:"DejaVu Sans Mono";}

          Das sieht jetzt bedeutend lesbarer aus.

          mfg Beat

          --
          ><o(((°>           ><o(((°>
             <°)))o><                     ><o(((°>o
          Der Valigator leibt diese Fische
    2. »» $text="text {array:daten} hallo{/array:daten} vieltext";
      »» Jetzt möchte ich alles, was zwischen den array:-Klammern steht auslesen:

      »» Problem an der Sache: Wie mache ich dem klar, das ich genau die Angaben will, bei denen hinter dem Doppelpunkt dasselbe steht. Bei einem ersetzen würde müsste es ja mit $1 gehen, wie es beim auslesen gehen soll, weiß ich nicht.

      preg_match_all("!{array:([a-zA-Z0-9]*)}(.*?){/array:\2}!",$text,$list);
                       $1     $2             $3 ^ $4      \2

      mit \2 statt $1 oder $2
      nimm .*? statt .*

      Wenn du einen Ausdruck nicht speichern willst, verwende
      (?: ) statt ()

      mfg Beat

      Funktioniert leider nicht:

      <?  
        
      $text="viel text {array:daten} hallo{/array:daten} vieltext";  
      preg_match_all("!{array:([a-zA-Z0-9]*)}(.*?){/array:\2}!",$text,$list);  
        
      print_r($list);  
      ?>
      

      liefert folgendes Ergebnis:

      http://vfb-stuttgart.piranho.de/test.php

      1. $text="viel text {array:daten} hallo{/array:daten} vieltext";
        preg_match_all("!{array:([a-zA-Z0-9]*)}(.*?){/array:\2}!",$text,$list);

        print_r($list);
        ?>[/code]

        liefert folgendes Ergebnis:

        http://vfb-stuttgart.piranho.de/test.php

        Das glaube ich Dir nicht.

        1. Doch, war aber so, habe jetzt aber den Fehler gefunden.

          Statt \2 muss es \2 heißen, dann funktioniert es.

          1. Doch, war aber so, ...

            Dann "lügst" Du was den Inhalts von $text betrifft. Wenn der Code die angeblichen Ausgaben nicht hervorrufen kann und man erahnen muß, was Du statt deinem Beispiel in Wirklichkeit benutzt hast, dann dämpft das meinen Willen mich damit zu beschäftigen.

      2. Funktioniert leider nicht:

        Ich hatte im ersten Posting {} und () visuell nicht auseinander halten können.

        [code lang=php]<?

        $text="viel text {array:daten} hallo{/array:daten} vieltext";

        preg_match_all("!{array:([a-zA-Z0-9]*)}(.*?){/array:\2}!",$text,$list);

        preg_match_all("!{array:([a-zA-Z0-9]*)}(.*?){/array:\1}!",$text,$list);

        maskiere die { }, schon alleine meinen Augen zuliebe,
        wenn du sie nicht als Quantifikatoren brauchst.
        Die Backreferenz sollte $1 jetzt matchen, ergo \1

        in perl OK
        my $a="viel text {array:daten} hallo{/array:daten} vieltext";
        $a =~ m!{array:([a-zA-Z0-9]*)}(.*?){/array:\1}! and print $1, $2;

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
  2. Wenn man von deinem Beitrag in München mit zehn Minuten ohne daß man am Flughafen noch einchecken muß dann startet man im Grunde genommen am Flughafen ...

    Problem an der Sache: Wie mache ich dem klar, das ich genau die Angaben will, bei denen hinter dem Doppelpunkt dasselbe steht.

    Ist das "dasselbe steht" eine Beschreibung oder eine Bedingung?