Andy: Regulärer Ausdruck - Ersatz wenn nicht zwischen Ausdruck

Hallo!

Ich hab' folgendes Problem:
Also, ich fang erstmal den kompletten Content meiner PHP-Ausgabe per ob_start, ob_get_contents, etc. ein. Hab also die komplette HTML-Seite in einer Variable. Somit kann ich im nachhinein noch Templates austauschen oder die Skriptgenerierungszeit an entsprechender Stelle einfügen.
Weiterhin werden Smilies ( :-), ;-), etc) durch ein entspechendes Bild ausgetauscht.
Ist ja alles schön und gut, einfach ereg_replace oder preg_replace genommen. Klappt ja auch, ABER:
Ich gebe Content variabel über ein Textarea ein und wenn jetzt schon mal ein Smilie-Symbol da drin war, z.B.: :-), dann steht beim wieder darstellen dort eben nicht :-), sondern <IMG SRC="smilies/smile.gif" ALT=":-)"> und wenn man das speichert, passt ja gar nichts mehr und beim nächsten mal hat man <IMG SRC="smilies/smile.gif" ALT="<IMG SRC="smilies/smile.gif" ALT=":-)">"> usw.
Also die grosse Frage (na endlich!!!!):
Wie müssen die regulären Ausdrücke aussehen, damit zwar alle Smilies (jetzt als Beispiel nehmt halt :-) ) ausgetauscht werden, aber nicht zwischen <textarea> und </textarea>?? Weitergehend gedacht natürlich auch gleich bei <input type="text" value=" und ">???

Ich hoffe die Problematik kommt rüber, ansonsten erst mal sorry dafür!

Ciao,
Andy

  1. Hallo A.,

    a. vielleicht so:
    "/(^|</textara>):-)($|<textarea>)/U" ersetzen durch: "$1<img src="smiley">$2"

    b. String an "/<textarea>(.*)</textarea>/" mit preg_split() auftrennen, alle "/<textarea>(.*)</textarea>/" mit preg_match_all() einsammeln und in den Elementen, die aus preg_split hervorgegangen sind, die Erseztung durchführen. Anschließend die Arrays im Reißverschußsystem wieder zusammenfügen.

    Gruß, Andreas

    --
    <img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
    http://was-ist-das.andreas-lindig.de
    1. Hallo!

      a. vielleicht so:
      "/(^|</textara>):-)($|<textarea>)/U" ersetzen durch: "$1<img src="smiley">$2"

      Brett vorm Kopf zerschlagend!!!
      Also der Ansatz ist total richtig, wieso bin ich da nicht selbst draufgekommen???
      Gut, der Ausdruck passt natürlich nicht ganz, aber ich werd mal rumtesten!
      In Worten: Es wird halt zwischen Anfang und Ende des Strings ersetzt oder zwischen </textarea> und Ende oder zwischen Anfang und <textarea>! Mann, ist einfach, brillant!
      Schau ma mal!

      b. String an "/<textarea>(.*)</textarea>/" mit preg_split() auftrennen, alle "/<textarea>(.*)</textarea>/" mit preg_match_all() einsammeln und in den Elementen, die aus preg_split hervorgegangen sind, die Erseztung durchführen. Anschließend die Arrays im Reißverschußsystem wieder zusammenfügen.

      Ist ein wenig kompliziert, ich bau mal a) aus!

      Danke,
      Andy

      1. Gut, der Ausdruck passt natürlich nicht ganz, aber ich werd mal rumtesten!

        hab' was vergessen: "/(^|</textara>)(.*):-)(.*)($|<textarea>)/Um" ersetzen durch: "$1$2<img src="smiley">$3$4"

        Du mußt natürlich auch noch die vorkommenden Zeichen dazwischen suchen.

        In Worten: Es wird halt zwischen Anfang und Ende des Strings ersetzt oder zwischen </textarea> und Ende oder zwischen Anfang und <textarea>!

        _oder_ zwischen </textarea> und <textarea>, wenn Du zwei oder mehr Eingabebereiche hast

        b) Ist ein wenig kompliziert...

        so hab' ich's neulich gemacht. Ist zwar etwas aufwändig, aber man hat dann innerhalb des zu ändernden Teilblocks alle Freiheiten.

        Gruß, Andreas

        --
        <img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
        http://was-ist-das.andreas-lindig.de
        1. hab' was vergessen:...

          noch was :) - Modifikator s statt m.

          Gruß, Andreas

          --
          <img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
          http://was-ist-das.andreas-lindig.de
          1. Servus Andreas

            Elementarer Denkfehler beiderseits! :-(

            Es wird trotzdem jedes :-) ersetzt, da es ja immer zwischen Anfang und Ende des Strings steht!!!! Und die Regex sagt ja jedes Vorkommen zwischen
            </textarea> oder Anfang
            und
            <textarea> oder Ende

            => zwischen Anfang und Ende

            Tja, da muss noch ein bißchen drüber nachgegrübelt werden!

            Danke daweil,
            Andy

            1. Es wird trotzdem jedes :-) ersetzt, da es ja immer zwischen Anfang und Ende des Strings steht!!!!

              hast Du denn die Modifikatoren benutzt - besonders /U?

              naja, ich weiß jedenfalls, warum ich Methode b) verwendet habe - geht prima ;)

              Gruß, Andreas

              --
              <img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
              http://was-ist-das.andreas-lindig.de
              1. Hallo!

                Es wird trotzdem jedes :-) ersetzt, da es ja immer zwischen Anfang und Ende des Strings steht!!!!

                hast Du denn die Modifikatoren benutzt - besonders /U?

                Jaja! Ausserdem gibt es damit ein anderes Problem: Es wird nur ein Vorkommen von :-) ersetzt!

                naja, ich weiß jedenfalls, warum ich Methode b) verwendet habe - geht prima ;)

                Hab' ich jetzt auch!!! Geht!
                Hier meine Variante fürs Archiv:
                <CODE>
                 $splitedOutput=preg_split("/(<textarea.*?>|</textarea>|<input type="text".*?>)/msi",$Output,-1,PREG_SPLIT_DELIM_CAPTURE); // $Output aufsplitten
                 $Output="";
                 $textarea=false;
                 foreach ($splitedOutput as $actualPart) {
                  if (preg_match("/<textarea.*>/Umsi",$actualPart)) $textarea=true; // Beginnt ein Textarea?????
                  if (preg_match("/</textarea>/Umsi",$actualPart)) $textarea=false; // Endet ein Textarea????
                  if (!$textarea&&!preg_match("/<input type="text".*>/Umsi",$actualPart)) { // Falls kein INPUT Text-Field oder kein Textarea
                    $actualPart=eregi_replace(":-)","<IMG SRC="smiley.gif" ALT=":-)",$actualPart); // Hier Ersetzungen wie gewünscht!
                  }
                  $Output.=$actualPart; // und zusammenfügen
                 }
                </CODE>
                In $Output steht am Anfang die komplette HTML-Seite und zum Schluss die geparste Seite! Es funzt!

                Noch mal danke!!!!

                Ciao,
                Andy

                1. Trotzdem ein Fehler drin:

                  if (!$textarea&&!preg_match("/<input type="text".*>/Umsi",$actualPart)) { // Falls kein INPUT Text-Field oder kein Textarea

                  Es muss natürlich heissen "Falls kein INPUT Text-Field UND kein Textarea! ;-)

                  Naja!

                  Also Thema abgeschlossen!
                  Ich hoffe, dass das Codebeispiel einigen anderen auch hilft!

                  Nochmal ciao,
                  Andy

                2. Und noch ein Fehler, der mir jetzt auffällt

                  $actualPart=eregi_replace(":-)","<IMG SRC="smiley.gif" ALT=":-)",$actualPart); // Hier Ersetzungen wie gewünscht!

                  Muss natürlich ALT=":-)" sein!

                  Für weitere Fehler keine Verantwortung!
                  Hab' meine fertige Lösung rüberkopiert, aber auf's Thema umgeschneidert.

                  Ciao,
                  Andy

  2. Hallo Andy,

    ich glaube, ich hab' Dich verstanden ;) Ich würde es folgendermaßen machen: Bevor Du den Inhalt in die textarea ausgibst, machst Du die Bilderersetzung rückgängig bzw. setzt den Originaltext vor der Ersetzung ein. Aus dem img-Tag mit dem Smiles drin wird also wieder ein Smiley. Das schaut für den Benutzer besser aus, da er keinen HTML-Code in der textarea zu sehen bekommt, und für Dich ist es einfacher zu bearbeiten. Abgesehen davon sollte man immer vorsichtig sein, wenn man von Usern eingegebenen Text ungefiltert in eine Webseite einbaut - ich könnte z.B. gefährlichen JavaScript-Code einbetten. Also besser alle HTML-Tags aus den Eingaben ausfiltern oder nur bestimmte Tags zulassen. Zu dem von Dir gewünschten Regulären Ausdruck: Ich glaube, so einen Ausdruck kann man nicht konstruieren.

    Simon

    1. Hallo

      ich glaube, ich hab' Dich verstanden ;)

      Danke!
      [Rest schnippschnapp]

      Was du geschrieben hast ist schon logisch, aber ich möchte an dem Code zwischen drin halt nichts ändern, sondern nur den Content den ich in der Variable habe bearbeiten!
      Deine Ausführungen zu Sicherheit sind richtig! Wenn meine Inhalte regulär ausgegeben werden laufen sie erst durch htmlentities() durch, also keine Gefahr! Dies geschieht schon im Skript.
      Die Contentbearbeitung aber erst am Ende!
      Schau dir mal den Vorschlag von Andreas an. Ist eigentlich schon der reguläre Ausdruck den ich gesucht habe, muss nur dran gefeilt werden!

      Trotzdem danke,
      Andy