You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Saturday, October 18th 2008, 4:12pm

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.

PHP Quellcode

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

Die Funktion sieht folgendermaßen aus:

PHP Quellcode

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

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

Bash

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

Nach echo-Ausgabe erscheint im Quelltext der Testdatei nur:

Bash

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? :)

2

Saturday, October 18th 2008, 5:26pm

Schau dir den Modifikator e mal an

http://de.php.net/preg_replace

PHP Quellcode

1
2
3
4
5
<?php
preg_replace("/(<\/?)(\w+)([^>]*>)/e",
             "'\\1'.strtoupper('\\2').'\\3'",
             $html_body);
?>


... und poste die Lösung ;)

3

Saturday, October 18th 2008, 8:34pm

PHP Quellcode

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

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? :(

4

Saturday, October 18th 2008, 8:39pm

Deine Modifier aus Code1 waren schon ganz ok... isU - dort hättest du nur das e ergänzen müssen.

relevant ist Modifier s:

Quoted

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.

http://de.php.net/manual/de/reference.pc…n.modifiers.php

5

Saturday, October 18th 2008, 8:42pm

Perfekt, klappt einwandfrei. Vielen Dank, d0nut!

Similar threads

Social bookmarks