[PHP5] Problem mit Regexpr.

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [PHP5] Problem mit Regexpr.

    Nabend alle zusammen,

    Ich brauch mal einen Tipp für das benutzen einer RegExpr.
    Das wäre mal mein Beispielcode:

    PHP-Code:
    <statement>
        <
    attributes>
            <
    db_art="DB1">
            <
    db_nr=1>
            <
    param1="muh">
            <
    param2="Kuh und Weide">
        </
    attributes>
        <
    query>
            
    SELECT `spalte1`, `spalte2`, `spalte3`, `spalte4`, `spalte5
                        
    FROM tabelle 
                        WHERE x LIKE 
    '1' 
                        
    ORDER BY pos DESC
        
    </query>
    </
    statement>

    <
    statement>
        <
    attributes>
            <
    db_art = ="DB2">
            <
    db_nr 1>
            <
    testparameter="Muh">
            <
    nochmehr="Kuh und Weide">
        </
    attributes>
        <
    query>
            
    SELECT `spalte6`, `spalte7`, `spalte8`, `spalte9`, `spalte0
                        
    FROM tabelle 
                        WHERE x LIKE 
    '1' 
                        
    ORDER BY pos DESC
        
    </query>
    </
    statement
    Ich versuche seit geraumer Zeit die Blöcke <statement>...</statement> als einzelne ArrayElemente zu speichern. Anschließend wollte ich auf diese Art und Weiße auch die Inhalte stück für Stüpck zerlegen lassen, so dass ich damit arbeiten kann. Es scheitert leider schon am zerlegen der 2 vorhandenen <statement> Blöcke.

    Mein bisheriger Versuch ist folgender:
    ( Sämtliche Umbrüche und Leerzeichen am Ende der Zeilen sind schon entfernt... ich habe also einen String am Stück... )

    preg_match_all ("@<statement>(.*)</statement>@", $parsestring, $statement_parse);

    Das Problem ist nun, dass er zwar 2 ArrayElemente zurückgibt aber in jedem immer der Komplette Inhalt meines Strings steht.
    Was ist an meiner Vorgehensweise falsch...?

    Wäre für einen guten Tipp sehr dankbar, da ich die RegExpr. noch nicht so ganz verstanden habe.

    Mario

  • #2
    Re: [PHP5] Problem mit Regexpr.

    preg_match_all ("@<statement>(.*)</statement>@U", $parsestring, $statement_parse);

    U ist der sogenannte ungreedy modifier.
    ist dieser modifier nicht gesetzt, versucht der regex so viel wie möglich zu matchen: alles innerhalb vom ersten <statement> bis zum letzten </statement>

    Kommentar


    • #3
      [PHP5] RegularExpre.

      Hi.... danke schonmal für den Tipp.

      Nun liest er es sagen wir mal zu 50% korrekt aus.

      Hier das Array:

      PHP-Code:
      <pre>Array
      (
          [
      0] => Array
              (
                  [
      0] => <statement>
      <
      attributes>
      <
      db_art="MYSQL">
      <
      db_nr=1>
      <
      param1="muh">
      <
      param2="Kuh und Weide">
      </
      attributes>
      <
      query>
      SELECT `spalte1`, `spalte2`, `spalte3`, `spalte4`, `spalte5
      FROM tabelle 
      WHERE x LIKE 
      '1' 
      ORDER BY pos DESC
      </query>
      </
      statement>
                  [
      1] => <statement>
      <
      attributes>
      <
      db_art = ="mSQL">
      <
      db_nr 1>
      <
      testparameter="Muh">
      <
      nochmehr="Kuh und Weide">
      </
      attributes>
      <
      query>
      SELECT `spalte1`, `spalte2`, `spalte3`, `spalte4`, `spalte5
      FROM tabelle 
      WHERE x LIKE 
      '1' 
      ORDER BY pos DESC
      </query>
      </
      statement>
              )

          [
      1] => Array
              (
                  [
      0] => 
      <
      attributes>
      <
      db_art="MYSQL">
      <
      db_nr=1>
      <
      param1="muh">
      <
      param2="Kuh und Weide">
      </
      attributes>
      <
      query>
      SELECT `spalte1`, `spalte2`, `spalte3`, `spalte4`, `spalte5
      FROM tabelle 
      WHERE x LIKE 
      '1' 
      ORDER BY pos DESC
      </query>
                  [
      1] => 
      <
      attributes>
      <
      db_art = ="mSQL">
      <
      db_nr 1>
      <
      testparameter="Muh">
      <
      nochmehr="Kuh und Weide">
      </
      attributes>
      <
      query>
      SELECT `spalte1`, `spalte2`, `spalte3`, `spalte4`, `spalte5
      FROM tabelle 
      WHERE x LIKE 
      '1' 
      ORDER BY pos DESC
      </query>
              )

      )
      </
      pre
      Warum legt er alles doppelt an? Muss ich hier dennoch irgendwo eine Begrenzung setzen?

      Mario

      Kommentar


      • #4
        [PHP5] RegularExpre.

        Hab eben bemerkt, dass er mit preg_match_all das ganze doppelt ausführt und mit preg_match scheint er es 100% korrekt zu machen.
        Was macht preg_match anders ???
        Ich versteh die Unterschiede dieser Funktionen nicht.

        Mario

        Kommentar


        • #5
          Re: [PHP5] RegularExpre.

          Original geschrieben von GELight
          Warum legt er alles doppelt an? Muss ich hier dennoch irgendwo eine Begrenzung setzen?
          das ist nicht doppelt:
          $statement_parse[0] enthält ein array mit dem kompletten suchmuster, also inkl. statement-tags
          und $statement_parse[1] den ersten klammer ausdruck, also alles ohne statement-tags

          kannst du aber dort nachlesen: preg_match_all

          Kommentar


          • #6
            Re: [PHP5] RegularExpre.

            Original geschrieben von GELight
            Was macht preg_match anders ???
            Ich versteh die Unterschiede dieser Funktionen nicht.
            handbuch:
            preg_match() gibt die Anzahl der Übereinstimmungen mit Suchmuster zurück. Das ist entweder 0 (keine Übereinstimmung) oder 1, weil preg_match() die Suche nach der ersten Übereinstimmung beendet. Im Gegensatz dazu setzt preg_match_all() die Suche bis zum Ende von Zeichenkette fort.
            und mit preg_match scheint er es 100% korrekt zu machen
            genauso wie preg_match_all, oder kannst du ein nachvollziehbares gegenbeispiel nennen?

            Kommentar


            • #7
              Du kannst auch wie hier gezeigt statt greedy/ungreedy lazy verwenden
              preg_match_all("@<statement>(.[COLOR=red]*?[/COLOR] )</statement>@", $parsestring, $statement_parse);

              Kommentar


              • #8
                [PHP5] RegularExpre.

                Nabend...

                Also die Variante von 3DMax funktionierte dann doch, nachdem ich begriffen hatte, was das suchmuster war...
                Es läuft nun alles wunderbar... danke nochmal an 3DMax.

                @jmc:

                Genau deinen Syntax hatten wir ca. 15min vorher und da hatte er uns auch irgendwie das falsche zurück gegeben... ich weiß jetzt nicht mehr warum, da wir die andere Methode dann weiter geführt hatten.

                Mario

                Kommentar

                Lädt...
                X