Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] preg_match_all - Mehrzeilige Werte

Einklappen

Neue Werbung 2019

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

  • [Erledigt] preg_match_all - Mehrzeilige Werte

    Hallo zusammen

    Ich würde gerne mittels preg_match_all einen mehrzeiligen String nach gewissen Suchmustern zerlegen.

    Mein Code:
    PHP-Code:
    $string = <<<FOO
    <A1>Test Betreff 01
    <C1>Hallo, dies<asdf> ist ein mehrzeiliger
    Test
    <D75>Zeile 3
    FOO;

    $pattern '/^(<[\w]+[^>]*>)(.*)/im';
    preg_match_all($patternstring$result,PREG_PATTERN_ORDER); 
    Das Resultat:
    Code:
    Array
    (
        [0] => Array
            (
                [0] => <A1>Test Betreff 01</A1>
                [1] => <C1>Hallo, dies<asdf> ist ein mehrzeiliger
                [2] => <D75>Zeile 3
            )
    
        [1] => Array
            (
                [0] => <A1>
                [1] => <C1>
                [2] => <D75>
            )
    
        [2] => Array
            (
                [0] => Test Betreff 01</A1>
                [1] => Hallo, dies<asdf> ist ein mehrzeiliger
                [2] => Zeile 3
            )
    
    )
    Der Array sieht schon ganz gut aus, nur den mehrzeiligen Wert in <C1> kriege ich nicht hin, er bricht immer am Ende der Zeile ab (\n Test fehlt).

    Ich hoffe, jemand kann mir helfen.

  • #2
    Der Modifier "s" ermöglicht das.

    Kommentar


    • #3
      Ich zietier mal Wikipedia

      Beliebiges Zeichen

      Ein Punkt (.) bedeutet, dass an seinem Platz ein (fast) beliebiges Zeichen stehen kann. Die meisten RegExp-Implementierungen sehen standardmäßig Newline (Zeilenumbruch) nicht als beliebiges Zeichen an, jedoch kann in einigen Programmen mithilfe des sogenannten Single-Line-Modifiers s (zum Beispiel in /foo.bar/s) ebendies erreicht werden.
      Edit: da war wohl jemand schneller...

      Kommentar


      • #4
        Hallo zusammen

        Mit dem Modifier s nimmt er mir das ganze in das erste Resultat:
        PHP-Code:
         $pattern '/^(<[\w]+[^>]*>)(.*)/s'
        Code:
        Array
        (
            [0] => Array
                (
                    [0] => <A1>Test Betreff 01
        <C1>Hallo, dies<asdf> ist ein mehrzeiliger
        Test
        <D75>Zeile 3
                )
        
            [1] => Array
                (
                    [0] => <A1>
                )
        
            [2] => Array
                (
                    [0] => Test Betreff 01
        <C1>Hallo, dies<asdf> ist ein mehrzeiliger
        Test
        <D75>Zeile 3
                )
        
        )
        Wie kann ich das verhindern?

        Kommentar


        • #5
          STichwort Gierigkeit/greedyness

          Kommentar


          • #6
            Finde dein $pattern auch leicht merkwürdig...

            Kommentar


            • #7
              Leider bekomme ich es noch immer nicht hin:

              Code:
              <A1>Test Betreff 01
              <B1>Test Betreff 02
              <C1>Hallo, dies ist ein mehrzeiliger
              Test
              <D75>Zeile 3
              Pattern:
              Code:
              ^<.*?>(.*?)<
              Resultat:
              Code:
              Array
              (
                  [0] => Array
                      (
                          [0] => <A1>Test Betreff 01
              <
                          [1] => <C1>Hallo, dies ist ein mehrzeiliger
              Test
              <
                      )
              
                  [1] => Array
                      (
                          [0] => Test Betreff 01
              
                          [1] => Hallo, dies ist ein mehrzeiliger
              Test
              
                      )
              
              )
              Es wird bis (und mit) erstes Zeichen gesucht, und somit wird der Tag <B1> und <D75> ignoriert.

              Wie kann ich das unterdrücken?

              PS: Danke für Eure Antworten, doch "Finde dein $pattern auch leicht merkwürdig... " hilft mir nicht sehr, das $pattern ist ja mein Problem

              Kommentar


              • #8
                Weiß erlichgesagt noch nicht ganz wie du dir das vorstellst...
                Also falls du nur beides trennen willst:

                PHP-Code:
                $pattern '#^(<[^>]+>)([^<]+)#ism'
                Das liefert folgendes Ergebnis:
                Code:
                Array
                (
                    [0] => Array
                        (
                            [0] => <A1>Test Betreff 01
                
                            [1] => <B1>Test Betreff 02
                
                            [2] => <C1>Hallo, dies ist ein mehrzeiliger
                Test
                
                            [3] => <D75>Zeile 3
                        )
                
                    [1] => Array
                        (
                            [0] => <A1>
                            [1] => <B1>
                            [2] => <C1>
                            [3] => <D75>
                        )
                
                    [2] => Array
                        (
                            [0] => Test Betreff 01
                
                            [1] => Test Betreff 02
                
                            [2] => Hallo, dies ist ein mehrzeiliger
                Test
                
                            [3] => Zeile 3
                        )
                
                )
                edit: so vielleicht ?!

                Falls du auch so "<" in dem Text hast / haben willst musst du eben mit Look-Arounds arbeiten ob das auch ein "Tag" ist oder das Zeichen nur einzeln verwendet wurde...

                Kommentar


                • #9
                  Hallo Destruction

                  Super, das hilft mir schon ein grosses Stück weiter.
                  Es kann sein, dass das "<" oder ">" ebenfalls im Text vorkommt, dann müsste es im Text bleiben.
                  Was ich definieren kann ist, dass ein Tag IMMER am Zeilenanfang steht.

                  Ich werd da noch ein bisschen rumprobieren müssen.

                  Danke vielmals für das Pattern, das hilft enorm!

                  Kommentar


                  • #10
                    Gerne

                    Kommentar


                    • #11
                      Vielleicht habe ich es überlesen, aber hast du überhaupt erklärt, welche Daten du am Ende erhalten möchtest?

                      Kommentar


                      • #12
                        Es kann sein, dass das "<" oder ">" ebenfalls im Text vorkommt, dann müsste es im Text bleiben.
                        Das ist doch jetzt schon Murx. Nicht ohne Grund haben alle AUszeichnungssprachen für diesen Fall eine Escape-Strategie. HTML z.B. Entities. Damit wirst Du nicht weit kommen. Und ehrlich gesagt ist Dein Markup schon in der Idee ziemlich daneben.

                        Kommentar


                        • #13
                          Sollte es jemanden interessieren, hier mein das Pattern, welches mein Problem löst:
                          Code:
                          /<([^>]+)>(.*?)(?=\r\n<|\r<|\n<|$)/is
                          Danke Euch nochmals für Eure Hilfe!

                          Kommentar


                          • #14
                            Was wäre, wenn das <asdf> in die nächste Zeile rutschen würde?

                            Kommentar

                            Lädt...
                            X