Alternative zu rekursiven Pattern?

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

  • Alternative zu rekursiven Pattern?

    Hallo,

    Vor einiger Zeit habe ich mit meiner Template Klasse beim parsen von verschachtelten Blöcken rausgefunden, dass rekursive Pattern den Server zum Abtürzen bringen können, und das bei mir auch voller Freude taten.

    Da ich bis jetzt immer noch keine Lösung des Problems gefunden habe, geb ich es auf. Gibt es eine Alternative zu rekursiven Pattern? Ich möchte Blöcke in einem Template parsen, wobei die beliebig tief verschachtelte unter-Blöcke haben dürfen. In der Theorie klappt es mit (?R), in der Praxis stürzt Apache ab.

    Wäre nett, wenn mir jemand helfen könnte.

    Grüße, Oli

  • #2
    also den apache mit EINEM Pattern zum absturz zu bringen ist schon krass.

    Erfahrungsgemäßt brauchst du seltens mehr als 3 blöcke.

    Was genau machst du denn??

    *verschieb* da kein eindeutig definiertes PHP-Problem
    Interesting Read: Unsere Regeln | Strings richtig trennen/verbinden |SGA-Tool |Energieverbrauch überwachen | JOINs, das leidige Thema

    Kommentar


    • #3
      Eine mögliche Option:

      - Matche vom ersten Blockanfang bis zum ersten Blockende
      - Zähle die Blockanfänge dazwischen
      - Vergrößere dein Suchergebnis so lange, biss du genausoviel Blockende-Tags gefunden hast, wie es Blockanfänge gibt

      Weitere Option: Sorge dafür, dass die Blöcke eindeutig sind, sprich: Hänge noch einen eindeutigen Bezeichner an

      Weitere Option: ...
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        danke euch beiden.

        TobiaZ: Ja, das hab ich mir auch gedacht. Aber irgendwie isses doch nicht das wahre oder? Limits sind nie schön. *g*

        @mrhappiness: Ich hab schon öfter mit sowas rumgeknobelt, bin aber zumeist an mangelnden regex kenntnissen gescheitert.

        Ich schau mir das nochmal an.

        Kommentar


        • #5
          Ich habe das für mich so gelöst, dass die Blöcke im Start- und End-Tag den Blocknamen tragen:
          PHP-Code:
          <!--Begin block1--> ... Inhalt ... <!--End block1--> 
          Daraus ergeben sich folgende Vorteile:
          1. klare Struktur - man sieht sofort wo welcher Block endet im Gegensatz zu {/block} o.ä.
          2. mit einem einfachen RegEx findest du den kompletten Block (pattern='#<!--Begin ([a-z0-9_])-->(.*)<!--End $1-->#s'). Dann kannst du deine Funktion rekursiv aufrufen und erneut in .* suchen bis kein Block mehr gefunden wird. Dann bist du sicher, den innersten Block gefunden zu haben.

          Beim Test mit Apache 1.3 / 2 mit vier ineinander verschachtelten Blöcken ist mir nix abgestürzt.

          Kommentar


          • #6
            TobiaZ: Ja, das hab ich mir auch gedacht. Aber irgendwie isses doch nicht das wahre oder? Limits sind nie schön. *g*
            Von einem Limit war auch nie dir rede!

            Ich hab schon öfter mit sowas rumgeknobelt, bin aber zumeist an mangelnden regex kenntnissen gescheitert.
            Das vermute ich auch. Deshalb habe ich auch gefragt, was du genau machst.

            Wie wir das lösen, haben wir dir übrigens schon des öfteren hier im Forum gesagt.
            Interesting Read: Unsere Regeln | Strings richtig trennen/verbinden |SGA-Tool |Energieverbrauch überwachen | JOINs, das leidige Thema

            Kommentar


            • #7
              Tobiaz: Hm, ich hatte mal nen ganz langen Thread, aber am Ende wurde mir gesagt, ich soll rekursive Pattern benutzen, und auf das Absturz-Problem hin kam nur von irgendwem, er wolle sich damit beschäftigen, und dabei isses auch geblieben.

              Definition im Endtag hab ich mir auch überlegt, find ich aber nicht so schön.

              Ich gucks mir nochmal an. Ich bin noch ein ziemlicher PHP-Anfänger, deswegen entschuldigt meine (dummen) fragen.

              Kommentar


              • #8
                Original geschrieben von OliOli
                Definition im Endtag hab ich mir auch überlegt, find ich aber nicht so schön.
                Dann lass du sie weg und lass die Templateenginge das übernehmen

                Blockanfang: %% BLOCK %%
                Blockende %% BLOCKENDE %%

                Alle %% BLOCK %% durch %% BLOCK %% und eine eindeutige ID ersetzen
                Diese eindeutigen IDs speichern
                Über eindeutige IDs iterieren (rückwärts) und
                - %% BLOCK <eindeutige ID> %% bis %% BLOCKENDE %% ersetzen durch
                &nbsp;&nbsp;%% BLOCK <eindeutige ID> %% bis %% BLOCKENDE <eindeutige ID> %%

                Jetzt die eigentliche Templateverarbeitung starten und matchen von %% BLOCK (.*) %% bis %% BLOCKENDE $1 %%
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar

                Lädt...
                X