Verschachtelte Suche mit preg_match_all()

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

  • Verschachtelte Suche mit preg_match_all()

    Hallo,

    bin gerade dabei, mir eine kleine BBCode Funktion zu schreiben. Ich suche mit preg_match_all nach sämtlichen Vorkommen von [b]text[b], [i]text[i] usw ... alles in einem Rutsch
    Klappt auch fast alles wunderbar, bis auf das, dass ich ein Problem mit verschachtelten Tags habe. Wenn ich [b][i]text[i][b] habe wird [b][i]text[i][b] gefunden, [i]text[i] aber nicht. Hat irgendjemand eine Idee, wie ich dieses Problem lösen könnte, ohne alle Ergebnisse noch mal seperat durchsuchen zu müssen?

    xblax

  • #2
    warum nicht eine fertige klasse benutzen?

    Und muss ich bei dem tollen Wetter wirklich in die Glaskugel gucken? Das blendet immer so...

    Kommentar


    • #3
      Original geschrieben von TobiaZ
      warum nicht eine fertige klasse benutzen?

      Und muss ich bei dem tollen Wetter wirklich in die Glaskugel gucken? Das blendet immer so...
      Wollte ich eine fertige Klasse nehmen, hätte ich danach gefragt.

      Ich glaub ich habe mich klar und deutlich ausgedrückt. Aber trotzdem nochmal eine Zusammenfassung, damit es wirklich alle verstehen:
      Ich suche nach einer Möglichkeit, damit preg_match_all() Ergebnisse innerhalb der Ergebnisse findet.

      Kommentar


      • #4
        Also Projekthilfe. Ansonsten kannst du dir ja nochmal überlegen, ob du dich vielleicht doch mal bequemst und etwas Code/deine Ansätze zeigst.

        *move*

        Kommentar


        • #5
          [Tester gesucht]

          rekursiv mit preg_replace_callback()?

          Kommentar


          • #6
            Nein das gehört nicht wirklich zur Projekthilfe, denn es geht nur um die Funktion preg_match_all()

            Aber Bitte, etwas beispiel Code:
            PHP-Code:
            $header('Content-Type: text/plain');
            $text 'Das ist ein <b><i>Text</i></b> mit 2 verschachtelten BBCodes.';
            $search '!<(b|i)>(.*?)</\\\\1\>!';
            preg_match_all$search$text$resultsPREG_SET_ORDER);
            print_r($results); 
            Ergibt:
            Code:
            Array
            (
                [0] => Array
                    (
                        [0] => <b><i>Text</i></b>
                        [1] => b
                        [2] => <i>Text</i>
                    )
            
            )
            Ich erwarte:
            Code:
            Array
            (
                [0] => Array
                    (
                        [0] => <b><i>Text</i></b>
                        [1] => b
                        [2] => <i>Text</i>
                    )
                [1] => Array
                	(
                        [0] => <i>Text</i>
                        [1] => i
                        [2] => Text
                	)
            )

            Kommentar


            • #7
              Nein das gehört nicht wirklich zur Projekthilfe
              Dann kannst du sicher auf penizillins Hinweis eingehen.
              EDIT:
              oki.

              Kommentar


              • #8
                @penizillin
                Danke, preg_replace_callback() hört sich für mich sehr brauchbar an
                Ich werde versuchen, was ich daraus machen kann.

                Vermute allerdings, dass die Performance dabei ziemlich auf der Strecke bleiben wird.
                Zuletzt geändert von xblax; 22.04.2007, 15:45.

                Kommentar


                • #9
                  du musst das rad ja auch nicht neu erfinden..

                  Kommentar


                  • #10
                    OffTopic:
                    Wenn er das nicht wollte, hätte er auch nicht gefragt.

                    Kommentar


                    • #11
                      Mit dem (falschen) Ausdruck hättest du auch schon am Anfang rausrücken können oder?
                      EDIT:
                      Das preg_match_all auch alles [zurückgibt was gefunden wird sagt doch der Name.] (Man sollte auch das schreiben was man denkt :P)

                      PHP-Code:
                      !<(b|i)>(.*?)</\\1>! 
                      Gehen wir doch mal das Parsing durch. Es wird ein < gefunden, dann auf b festgelegt. Jetzt wird der kürzeste Teil gesucht bis wieder </b> kommt. Der ist nun mal <i>Text</i>. Da kein Text mehr kommt ist der Parser fertig.
                      Zuletzt geändert von tontechniker; 22.04.2007, 19:21.
                      Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                      Kommentar


                      • #12
                        Original geschrieben von tontechniker
                        Das preg_match_all auch alles findet.
                        wie meinen?

                        Kommentar


                        • #13
                          In php5 gibt es dazu ein rekursiv-Pattern, siehe Manual, wie man das allerdings wirklich verwendet ist selbst mir nicht klar ... bei mir verheddert sich das (angeblich) immer in einer Endlosschleife, was ja aufgrund des begrenzten Textes schon nicht möglich ist, aber wenn php das meint ~...

                          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                          Wie man Fragen richtig stellt

                          Kommentar

                          Lädt...
                          X