html_entity_decode mit preg_replace verwenden

Von: , Frage gestellt am Sa, 31. Jan 2009

Hallo!
Ich versuche für einen Blog so eine Art BB-Code zu entwickeln, wo es aber auch durch [html]htmlcode[/html] erfahreneren Nutzern möglich sein soll, html zu verwenden. Dafür habe ich jetzt folgende Zeilen programmiert:

$string = htmlentities($string);
/*
sonstige
BB-Code-Ersetungen
*/
$string = preg_replace("#\[html\](.*)\[/html\]#i", html_entity_decode("$1"), $string);
echo $string;


Mit der letzten Zeile soll nun der erste Schritt für [html]-Bereiche wieder rückgängig gemacht werden. $1 steht deshalb in " ", da sonst ein Fehlermeldung aufgrund der Variablenbenennung erscheint.
Ausgegeben wird an dieser Stelle der String, der von htmlentities kommt, allerdings ohne die html-BB-Tags.
Woran liegt das? Wie kann man dieses Problem umgehen? Ich danke Euch schon einmal für Eure Antworten! Viele Grüße JojO

11 Antworten zu dieser Frage

  1. Antwort von nach 19 Stunden 0 hilfreich
    Re: html_entity_decode mit preg_replace verwenden

    $string = htmlentities($string);
    /*
    sonstige
    BB-Code-Ersetungen
    */
    $string = preg_replace("#\[html\](.*)\[/html\]#i",
    html_entity_decode("$1"), $string);
    echo $string;


    Mit der letzten Zeile soll nun der erste Schritt für
    [html]-Bereiche wieder rückgängig gemacht werden. $1 steht
    deshalb in " ", da sonst ein Fehlermeldung aufgrund der
    Variablenbenennung erscheint.
    man soll fehlermeldungen lesen und verstehen und den fehler beheben - nicht die fehlerausgabe unterdruecken.

    wo wird denn $1 deklariert?!

    $1 ist keine variable sondern wiederum ein suchmuster fuer den regex-parser und das auch erst, wenn der regex ausgefuehrt wird. nach deiner notation brauchst du es aber als variable schon wenn das script geparst wird. nach deiner notation muesstest du preg_replace_callback verwenden udn den aufruf von html_entity_decode in einer callback-funktion kapseln.

    aber eigentlich brauchst du das auch nciht, weil du sinngemaess schreiben kannst:

    $string = htmlentities($string);
    $string = preg_replace("#\[html\](.*)\[/html\]#i","\\$1",$string);
    $string = html_entity_decode($string);
    echo $string;
    


    aber ich glaube es wird nicht tun, weil html_entity_decode dein html kaputt macht.

    • Antwort von nach 22 Stunden 0 hilfreich
      Re^2: html_entity_decode mit preg_replace verwende

      Hallo, erstmal Danke für Deine Antwort.

      $string = htmlentities($string);
      $string = preg_replace("#\[html\](.*)\[/html\]#i","\\$1",$string);
      $string = html_entity_decode($string);
      echo $string;


      Wenn ich das so versuche, wird $1 ausgegeben. Ohne "\\" wird dann natürlich $string komplett wieder decodiert. Wenn ich jetzt sowas hier als Callback-Funktion verwende, klappt es auch nicht:

      function callback_html_decode($str) {
        return html_entity_decode($str);
      }


      >aber ich glaube es wird nicht tun, weil html_entity_decode dein html kaputt macht.

      Wie soll ich da ganze lösen, wenn es so nicht funktionieren soll?

      Gruß Jojo

      • Antwort von nach einem Tag 0 hilfreich
        Re^3: html_entity_decode mit preg_replace verwende

        $string = htmlentities($string);
        $string =
        preg_replace("#\[html\](.*)\[/html\]#i","\\$1",$string);
        $string = html_entity_decode($string);
        echo $string;

        Wenn ich das so versuche, wird $1 ausgegeben. Ohne "\\" wird
        dann natürlich $string komplett wieder decodiert.
        stimmt, da ist ein \ vor dem $1 zuviel. es muss "\$1" oder '$1' lauten. Wenn ich
        jetzt sowas hier als Callback-Funktion verwende, klappt es
        auch nicht:

        function callback_html_decode($str) {
          return html_entity_decode($str);
        }

        das ist ja auch keine gueltige callback funktion. bemuehe das manual. aber ich glaube es wird nicht tun, weil html_entity_decode
        dein html kaputt macht.
        Wie soll ich da ganze lösen, wenn es so nicht funktionieren
        soll?
        das ist abhaengig vom kontext und von dem was du im originalpost weggelassen hast.
        naja, taste dich ran.

        • Antwort von nach 2 Tagen 0 hilfreich
          Re^4: html_entity_decode mit preg_replace verwende

          Ah super, jetzt hab ich's geschafft und weiß auch was eine CallBack-Funktion ist;)

          $string = preg_replace_callback("#\[html\](.*)\[/html\]#i",
            create_function('$matches', 'return html_entity_decode($matches[1]);'), $string);


          So schaut das jetzt bei mir aus.

          Danke für Deine Hilfe!

        • Antwort von nach 4 Tagen 0 hilfreich
          Re^4: html_entity_decode mit preg_replace verwende

          Hallo.
          Inzwischen ist doch noch eine Frage aufgekommen. Ich verwende ja folgenden regulären Ausdruck:

          #\[html\](.*)\[/html\]#i


          Zum einen sind aber in dem Punkt keine Zeilenumbrüche vorhanden, was zu Problemen führt, wenn man einen [html]-bereich über mehrere Zeilen schreiben möchte. Daher habe ich das ganze zu diesem Ausdruck abgewandelt:

          #\[html\]([\s\S]*)\[/html\]#i


          Allerdings habe ich dann nach wie vor das Problem, dass etwa bei diesem String "[html]<h3>hallo</h3>[/html] [html]<p>hi</p>[/html]" als Haystack dies hier ausgegeben wird "<h3>hallo</h3>[/html] [html]<p>hi</p>", da das hintere [/html] als Endmarkierung verwendet wird.
          Das heißt, ich muss den Ausdruck so umformen, dass das erste vorkommende [/html] als Ende verwendet wird. Wie kann ich so etwas machen? Ich habe schon alles mögliche versucht, aber das klappt alles nicht so recht..

          Ich hoffe ihr könnt mir zumindest einen Gedankenanstoß geben, noch besser eine fertige Lösung, da es ein bisschen eilt. Vielen Dank!

          Gruß Jojo

          • Antwort von nach 4 Tagen 0 hilfreich
            Re^5: html_entity_decode mit preg_replace verwende

            Hallo.
            Inzwischen ist doch noch eine Frage aufgekommen. Ich verwende
            ja folgenden regulären Ausdruck:

            #\[html\](.*)\[/html\]#i


            Zum einen sind aber in dem Punkt keine Zeilenumbrüche
            vorhanden,
            modifier s "single line"
            #\[html\](.*)\[/html\]#si
            Allerdings habe ich dann nach wie vor das Problem, dass etwa
            bei diesem String "[html]<h3>hallo</h3>[/html]
            [html]<p>hi</p>[/html]" als Haystack dies hier
            ausgegeben wird "<h3>hallo</h3>[/html]
            [html]<p>hi</p>", da das hintere [/html] als
            Endmarkierung verwendet wird.
            modifier U "ungreedy"
            #\[html\](.*)\[/html\]#Usi
            Ich hoffe ihr könnt mir zumindest einen Gedankenanstoß geben,
            http://de2.php.net/manual/de/reference.pcre.pattern....

            • Antwort von nach 4 Tagen 0 hilfreich
              Re^6: html_entity_decode mit preg_replace verwende

              Super!! Danke!!

  2. Antwort von nach 2 Tagen 0 hilfreich
    Re: html_entity_decode mit preg_replace verwenden

    Hallo! Ich versuche für einen Blog so eine Art BB-Code zu entwickeln,
    wo es aber auch durch [html]htmlcode[/html]
    erfahreneren Nutzern möglich sein soll, html zu verwenden.
    Dafür habe ich jetzt folgende Zeilen programmiert:

    $string = htmlentities($string);
    /*
    sonstige
    BB-Code-Ersetungen
    */
    $string = preg_replace("#\[html\](.*)\[/html\]#i",
    html_entity_decode("$1"), $string);
    echo $string;


    Mit der letzten Zeile soll nun der erste Schritt für
    [html]-Bereiche wieder rückgängig gemacht werden. $1 steht
    deshalb in " ", da sonst ein Fehlermeldung aufgrund der
    Variablenbenennung erscheint.
    Ausgegeben wird an dieser Stelle der String, der von
    htmlentities kommt, allerdings ohne die html-BB-Tags.
    Woran liegt das? Wie kann man dieses Problem umgehen? Ich
    danke Euch schon einmal für Eure Antworten! Viele Grüße JojO
    Ich kapiere nicht ganz, was Du erreichen willst. Kannst
    Du mal ein konkretes Beispiel für konkrete Schritte geben?
    Was soll das html_entity_decode() bringen?

    Grüße

    CMБ

    • Antwort von nach 2 Tagen 0 hilfreich
      Re^2: html_entity_decode mit preg_replace verwende

      Hallo.
      Ich möchte - wie gesagt - so eine Art BB-Code für einen Blog erstellen. Dabei gehe ich von einem Nutzer aus, der überhaupt keine Ahnung von HTML etc hat. Also soll er auch < und > benutzen können, ohne dass irgendetwas passiert. Erfahrenere Nutzer sollen aber die Möglichkeit haben, über [html]htmltext[/html] doch HTML verwenden zu können.
      Also wende ich erst htmlentities an und möchte das dann wieder mit html_entity_decode für die [html]-Bereiche rückgängig machen, aber wie bereits beschrieben klappt das nicht so, wie ich mir das vorstelle..
      Viele Grüße der Jojo



Keine passende Antwort gefunden? Jetzt eigene Frage stellen!