Klaus: Reguläre Ausdrücke

Hallo,
also diese regulären Ausdrücke rauben mir echt den letzen Nerv.

Also ich versuche, dass ineinander verschachtelte Codes richtig ersetzt werden.

Beispiel:
{ge} Geschuetzer Text
{ge} auch geschuetzt {/ge}
Dies ist der Head
Geschuetzt zuendezuende {/ge}
Das ist meine Website
{ge} Nochmal geschuetzt {/ge}

Eigentlich sollte dies so ersetzt werden:
<ersetzt> Geschuetzer Text
{ge} auch geschuetzt {/ge}
Dies ist der Head
Geschuetzt zuendezuende </ersetzt>
Das ist meine Website
<ersetzt> Nochmal geschuetzt </ersetzt>

Dabei soll der Text zwischen <ersetzt>...</ersetzt> per base64 kodiert werden.

Falls ich jetzt folgenden Ausdruck benutzte:
/{\(.*?)\}/si

ergibt sich daraus folgendes:
<ersetzt> Geschuetzer Text
{ge} auch geschuetzt </ersetzt>
Dies ist der Head
Geschuetzt zuendezuende {/ge}
Das ist meine Website
<ersetzt> Nochmal geschuetzt </ersetzt>

Natürlich ist das ein Problem, denn wie gesagt der gefundene Text wird per Base64 kodiert und man Ende dekodiert.
Da erhält dann der User die unschöne Ausgabe dass dort nicht alles geschützt wurde.

Hat jmd. eine Idee wie man Problem lösen kann?

Grüße
Klaus

  1. Hi,

    also diese regulären Ausdrücke rauben mir echt den letzen Nerv.

    kein Wunder:

    Also ich versuche, dass ineinander verschachtelte Codes richtig ersetzt werden.

    Strukturen sind keine Muster. Regular Expressions können hier höchstens Hilfsmittel, keinesfalls aber Lösung sein.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo,
      hmm eine Möglichkeit wäre vielleicht:

      Suchen nach dem 1. {ge} danach gucken ob {/ge} oder {ge} als nächstes im Text vorkommt.
      Falls {/ge} als nächstes erscheint, dann wird der Block ersetzt.

      Falls {ge} der nächste Abschnitt ist, wird der Zähler um 1 erhöht. Danach wird wieder geschaut was danach folgt, ein {ge} oder ein {/ge}.

      Falls {/ge} folgt, wird von dem Zähler 1 abgezogen. Falls der Zähler wieder auf den Ursprungswert gelangt, weiß ich, dass alle geöffneten Tags wieder geschlossen wurde und ersetze dann alles zwischen dem ersten {ge} und dem {/ge} wo der Zähler wieder auf den Ursprungswert ist.

      1. Gibt es eine Möglichkeit die Positionen aller {ge} und {/ge} in ein Array zurück zu geben? Am besten Performance schonend.
      2. Gibt es eine leichtere Möglichkeit festzustellen, ob an einer bestimmten Stelle bereits alle geöffneten Tags wieder geschlossen wurden?
      3. Vielleicht kennt jmd. einen Script dafür, muss aber nicht sein ;)

      Grüße
      Klaus

      1. echo $begrueszung;

        1. Vielleicht kennt jmd. einen Script dafür, muss aber nicht sein ;)

        Das ist zwar nicht ganz das gesuchte, das Prinzip ist aber das gleiche:

        http://www.christian-seiler.de/projekte/php/bbcode/

        echo "$verabschiedung $name";

  2. Hallo,

    mit diesem Problem habe ich auch schon gekämpft, es aber letztlich nicht per RegExp gelöst, sondern durch eine andere Programmlogik.
    Das Problem ist natürlich, daß der reguläre Ausdruck nichts von der syntaktischen Bedeutung Deiner Tags {a} und {/a} weiß, d.h. zumindest mir ist kein Weg bekannt, wie man dem regulären Ausdruck beibringen kann, welches {/a} zu welchem {a} gehört.

    Er findet also bei: /{a}.*{/a}/si
    in: {a}außen {a}innen{/a} und wieder außen{/a}
    nur: außen {a}innen

    Vielleicht wäre aber ein anderer Ansatz denkbar:
    suche nach Text, der eingeschlossen ist von {a} oder {/a} und {a} oder {/a}.

    Es findet: /{/?a}[^{}]*{/?a}/si
    in: {a}außen {a}innen{/a} und wieder außen{/a}
    dies: außen innen und wieder außen

    Das ist jetzt allerdings nicht getestet, sondern eher aus dem Stegreif dahin"gejammt".
    Ein Schwachpunkt ist z.B., daß im Fließtext zwischen den Tags {a} und {/a} kein '{' und kein '}' vorkommen dürfen.

    Aber vielleicht hilft Dir dieser Ansatz ja.

    Ciao,
    Andreas

    1. Hallo,
      danke das bringt mich schon weiter
      Aus:
      {ge}Dies {ge}ist{/ge} geschützt{/ge}

      wird dann ( {ge} => <war> ):
      {ge}Dies <war>ist</war> geschützt{/ge}

      Falls ich jetzt dies in einer Schleife durchlaufen lassen, bis er alle {ge}...{/ge} ersetzt hat (also bis diese nicht mehr vorkommen), erhält man wenigsten keine unschöne Ausgabe mehr.

      Auch wenn es mir lieber wäre, wenn folgendes Entstanden wäre:
      <war>Dies {ge}ist{/ge} geschützt</war>

      Aber ein andere Problem ist wie gesagt, dass dort keine '{' oder '}' enthalten sein dürfen.

      Ich wollte den Tag benutzen, um andere Tags innerhalb vor dem Ersetzen zu schützen.
      Dafür wird am Anfang der enthaltene Text kodiert, und vor der Ausgabe wieder dekodiert. So werden dort keine weiteren Tags mehr gefunden, und der Text ist somit "geschützt".

      Möchte man aber {design_elemet} vor dem Ersetzen erschützen, geht das leider nicht.

      Grüße
      Klaus