preg_replace in Zusammenarbeit mit einer Funktion

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • preg_replace in Zusammenarbeit mit einer Funktion

    Guten Nachmittag :)
    Ich kämpfe seit einer Stunde mit einer Verbindung der Funktion 'preg_replace' und einer Funktion :(

    Folgende Zeile soll in der Variable $message den PHP-Code farbig hervorheben. Genutzt soll das ganze werden für ein BB-Code-System.

    Quellcode

    1. $message = preg_replace('#\[php\](.+)\[/php\]#isU',parse_php("\\1"),$message);

    Die Funktion sieht folgendermaßen aus:

    Quellcode

    1. function parse_php($str) {
    2. $str .= "<div style=\"border:1px solid #000; background:#f1f1f1;\">";
    3. $str .= highlight_string($str,true);
    4. $str .= "</div>";
    5. return $str;
    6. }

    Er lässt zwar die $message durch die Funktion durchlaufen, allerdings kommt diese unformatiert raus. Im Test habe ich die Variable so belegt:

    Quellcode

    1. $message = "<?php echo 'test'; ?>";

    Nach echo-Ausgabe erscheint im Quelltext der Testdatei nur:

    Quellcode

    1. <div style="border:1px solid #000; background:#f1f1f1;"><?php echo 'test'; ?></div>

    Der PHP-Code wurde also 1:1 übernommen und nicht eingefärbt.

    Kann mir jemand helfen? :)
  • Quellcode

    1. <?php
    2. function parse_php($str) {
    3. $str = highlight_string($str,true);
    4. $str = str_replace(" #000000","#000;",$str);
    5. $str = str_replace(" #007700","#007700;",$str);
    6. $str = str_replace(" #0000BB","#0000bb;",$str);
    7. $str = str_replace(" #DD0000","#dd0000;",$str);
    8. $str = str_replace("\n","",$str);
    9. $str = str_replace("<code>","",$str);
    10. $str = str_replace("</code>","",$str);
    11. return $str;
    12. }
    13. $message = "[code=php]<?php echo 'easy-coding.de'; ?>[/code]";
    14. $message = preg_replace("/\[php\](.*?)\[\/php\]/e", "'<div style=\"border:1px solid #000; background:#f1f1f1;\">'.parse_php('\\1').'</div>'",$message);
    15. echo $message;
    16. ?>
    Alles anzeigen

    Funktioniert einwandfrei :)
    Die str_replaces sind übrigens gewollt so, aber nicht notwendig.

    Ein Problem habe ich aber jetzt noch: Wenn der PHP-Code in den BB-Code-Tags mehrzeilig ist, wird er wieder nicht umgewandelt? :(
  • Deine Modifier aus Code1 waren schon ganz ok... isU - dort hättest du nur das e ergänzen müssen.

    relevant ist Modifier s:

    s (PCRE_DOTALL)
    Wenn dieser Modifikator gesetzt ist, passt das Metazeichen Punkt im Suchmuster auf alle Zeichen inklusive Zeilenumbrüche. Ohne diesen Modifikator sind Zeilenumbrüche ausgeschlossen. Dieser Modifikator entspricht dem Perl-Modifikator /s. Unabhängig davon, ob dieser Modifikator gesetzt ist, passt eine verneinende Zeichenklasse wie z.B. [^a] immer auf einen Zeilenumbruch.

    de.php.net/manual/de/reference.pcre.pattern.modifiers.php