adni123: preg_match mit "

Hallo,
ich moechte eine Zeichenkette auf folgendes durchsuchen:

<ID n="XX">
   -> XX ist eine beliebige Zahl; diese Zahl brauche ich dann
      zur weiteren Verwendung.

Probiert hab ich folgendes, weil ich das in PERL so da hatte:

if (preg_match("/<ID n="(\d*)">/", $line, $treffer)  && ($flag===1)) {$knoten=$1;}

Aber irgendwie kommt immer nur ein PARSE-ERROR.

Ich denk ja, das es mit den Hochkommas um \d zu tun hat? Aber ich weiss nicht, wie ich es loesen kann, weil die Hochkommas in der Zeile, doe geparst werden soll, auch wirklich vorhanden sind. Wollte die mit einem '' quoten, aber das ging auch nicht...

Danke Andi

  1. Liebe Andi,

    if (preg_match("/<ID n="(\d*)">/", $line, $treffer)  && ($flag===1)) {$knoten=$1;}

    Aber irgendwie kommt immer nur ein PARSE-ERROR.

    Das ist ja klar, denn ("..."..."...") gibt nunmal Probleme! Du hast zwei Möglichkeiten das zu korrigieren, entweder Du setzt Dein Suchmuster in einfache Anführungszeichen, oder Du maskierst die zu suchenden Anführungszeichen mit einem Backslash.

    if (preg_match('/<ID n="(\d)*">/', $line, $treffer) && ($flag===1))
    oder
    if (preg_match("/<ID n=\"(\d)*\">/", $line, $treffer) && ($flag===1))

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. if (preg_match('/<ID n="(\d)*">/', $line, $treffer) && ($flag===1))
      oder
      if (preg_match("/<ID n=\"(\d)*\">/", $line, $treffer) && ($flag===1))

      Oh, vielen Dank.
      Das geht jetzt ohne den Fehler. Super.
      Einzig, ich bekomme jetzt keine Treffer. Kann es daran liegen, dass das (\d*) durch die Hochkommas nicht geparst werden?

      Danke Andi

      1. Liebe Selfer,

        Einzig, ich bekomme jetzt keine Treffer. Kann es daran liegen, dass das (\d*) durch die Hochkommas nicht geparst werden?

        Tja, da ist ein Unterschied zwischen (\d*) und (\d)*! Welches meinst Du denn? Ich denke Du suchst ersteres! Die Hochkommas stören nicht, da sie nicht PHP-String-technisch interpretiert werden.

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        1. Einzig, ich bekomme jetzt keine Treffer. Kann es daran liegen, dass das (\d*) durch die Hochkommas nicht geparst werden?
          Tja, da ist ein Unterschied zwischen (\d*) und (\d)*! Welches meinst Du denn? Ich denke Du suchst ersteres! Die Hochkommas stören nicht, da sie nicht PHP-String-technisch interpretiert werden.

          Hm, also ich hab mal so gesucht:

          [code]if (preg_match('|<ID n=|', $line)) {print "$line<br>";}[\code]

          Da bringt er mir alle Zeilen die ich will. Sobald ich aber (\d*) mit ins Spiel bringe, zeigt er mir keine $line.

          Na ich probier noch mal ein bissl rum.
          Ansonsten ein schoenes WE
          Andi

          1. [code]if (preg_match('|<ID n=|', $line)) {print "$line<br>";}[\code]

            Also, hab es noch mal eingeschraenkt:

            if (preg_match('|<ID n="(.*)">|', $line)  && ($flag==1)) {echo "TREFFER";}
            bringt KEINE Ausgabe

            if (preg_match('|<ID n=(.*)>|', $line)  && ($flag==1)) {echo "TREFFER";}
            bringt eine Ausgabe

            if (preg_match('|<ID n=\d*>|', $line)  && ($flag==1)) {echo "TREFFER";}
            bringt aber auch KEINE Ausgabe

            Uhhhh, ich will mein PERL zurueck :-( :-)

            Andi

            1. [code]if (preg_match('|<ID n=|', $line)) {print "$line<br>";}[\code]

              So, jetzt hab ich es wohl:

              if (preg_match('|<ID n="([\d*])"/>|', $line,$treffer)  && ($flag==1))

              ist die Loesung. Also die " muessen doch gequotet werden und der Suchbegriff muss in eckige Klammern.

              Danke fuer eure Hilfe

              1. Liebe Selfer,

                So, jetzt hab ich es wohl:

                if (preg_match('|<ID n="([\d*])"/>|', $line,$treffer)  && ($flag==1))

                ist die Loesung. Also die " muessen doch gequotet werden und der Suchbegriff muss in eckige Klammern.

                Hmm, also die eckigen Klammern ergeben mit dem Sternchen keinen Sinn! Es sollte so auch ganz ohne gehen. Was das Escapen der Quotes angeht, so sollte es eigentlich auch ohne matchen, da das Suchmuster ja in einfachen Quotes steht...

                Aber wie ich sehe, hast Du deine $treffer wieder mit an Bord. Ob es daran lag?

                Liebe Grüße aus Ellwangen,

                Felix Riesterer.

                1. if (preg_match('|<ID n="([\d*])"/>|', $line,$treffer)  && ($flag==1))
                  Hmm, also die eckigen Klammern ergeben mit dem Sternchen keinen Sinn! Es sollte so auch ganz ohne gehen. Was das Escapen der Quotes angeht, so sollte es eigentlich auch ohne matchen, da das Suchmuster ja in einfachen Quotes steht...

                  Hm, also nur mit den eckigen Klammern wird die Zahl im $treffer-Array abgelegt. Keine Ahnung warum das ohne nicht geht.
                  Und auch nur, wenn die Hochkommas gequotet werden, schlaegt das preg_match ueberhaupt zu, will heissen, wertet die Regex in $line aus.

                  Danke fuer deine Hilfe
                  Andi

                  1. gudn tach Andi!

                    irgendwas ist hier faul. hast du mal in $line reingeschaut? steht da wirklich das drin was du glaubst, dass es drinsteht?

                    das script

                      
                    <?php  
                    function such_id($line, $i){  
                      echo "\ntest $i: $line\n";  
                      preg_match('|<ID n="(\d*)"/>|', $line, $treffer);  
                      echo 're1: '.((count($treffer)>1)? $treffer[1]:'nix')."\n";  
                      preg_match('|<ID n=\"([\d*])\"/>|', $line, $treffer);  
                      echo 're2: '.((count($treffer)>1)? $treffer[1]:'nix')."\n";  
                    }  
                    $i=0;  
                    such_id('foo<ID n="13"/>bar', ++$i);  
                    such_id('foo<ID n="5"/>bar', ++$i);  
                    such_id('foo<ID n="*"/>bar', ++$i);  
                    ?>
                    

                    gibt bei mir folgendes aus:
                    ---------------------------

                    test 1: foo<ID n="13"/>bar
                    re1: 13
                    re2: nix

                    test 2: foo<ID n="5"/>bar
                    re1: 5
                    re2: 5

                    test 3: foo<ID n="*"/>bar
                    re1: nix
                    re2: *
                    ---------------------------

                    bei dir nicht?

                    der regexp /([\d*])/ matcht genau ein zeichen, welches eine ziffer oder ein stern ist; ist also aquivalent zu /([0-9*])/

                    prost
                    seth

            2. Lieber Andi,

              if (preg_match('|<ID n="(.*)">|', $line)  && ($flag==1)) {echo "TREFFER";}

              Wo ist denn Dein $treffer geblieben? Sollte darin nicht der Treffer enthalten sein?

              Liebe Grüße aus Ellwangen,

              Felix Riesterer.

      2. gudn tach!

        Felix' vorschlag war ok. vielleicht ist $line gar nicht so gebaut, wie du sagtest?
        preg_match('/<ID n="(\d*)">/', $line, $treffer)
        sollte auf jeden fall funktionieren.

        Kann es daran liegen, dass das (\d*) durch die Hochkommas nicht geparst werden?

        nee.

        prost
        seth