Rückgabefunktion in eregi_replace() ?

Teh H4mst0R

Mitglied
Hallo, ich komm mal gleich zum Punkt:
Ich möchte einen Text, der vorher durch

htmlentities()

umgewandelt wurde nach BBCodes parsen lassen...
Ich verwende dafür reguläre Ausdrücke und es funktioniert auch alles sehr gut bis jetzt...

Nun möchte ich für die Syntax
Code:
[php_]/* code */[/php_]
Den php-Quelltext mittels

highlight_string($text,TRUE)

einfärben lassen, aber dafür muss alles zwischen
Code:
[php_]/* code */[/php_]
wieder umgewandelt werden in Quelltext mit Sonderzeichen...

dafür habe ich vor langer Zeit mal eine Funktion geschrieben, da ich die Texte auch anderweitig immer durch htmlspecialchairs() oder htmlentities() umwandle aber hin und wieder auch mal das Original brauche (ich hoffe ihr könnt noch folgen ^^).

(Für Ausgaben ist es eigentlich immer besser < und > ersetzen zu lassen, für Umlaute siehts da nicht anders aus...)

Die o.g. Funktion hab ich sinnigerweise

htmlentities_rev(string $text)

genannt und diese arbeitet wie schon erwähnt auch zuverlässig (return $text).

Nun zu dem Problem: Ich bekomme den Text fertig durch htmlentities() umgewandelt und möchte nun mit folgendem Code alles zwischen den beiden php-Tags (BBCode) wieder durch meine Funktion zurückwandeln lassen. Das Ergebnis soll dann erstmal so wie es ist in $text zurückgeschrieben werden.

PHP:
	$text = eregi_replace(
	"\[php\](".get_ex('[/php_]').	")\[/php\]",
	"<blockquote><pre>".
	htmlentities_rev("\\1").
	"</pre></blockquote>", $text);

Wegen eregi_replace() brauch ich keine komplizierte Schleife und die funktion get_ex() liefert automatisch das entsprechende Endtag (das _ ist wegen dem bbcode hier im forum)... So wird in der gesammten Text-Variable alles zuverlässig ersetzt.

Eigentliches Problem: Irgendwie wird für htmlentities_rev() als Parameter tatsächlich nur "\\1" übergeben (nix wird umgewandelt) und dann aber trotzdem der Text ersetzt, anstatt "\\1" wie es dann zu erwarten wäre... :suspekt:
(htmlentities_rev() liefert wirklich "\\1" zurück und erst danach wird ersetzt.)

Is es irgendwie möglich als 2. Parameter für eregi_replace() eine Funktion anzugeben, die das zu Ersetzende modifiziert zurückliefert? :confused:

Hab schon ne Menge probiert, aber selbst bei verschachtelten Funktionen weigert der sich strikt den Parameter vorher durch ne Funktion zu jagen und dann zu ersetzen..

Bin für jede Anregung dankbar ^^
 
Probier mal Folgendes:
PHP:
$text = eregi_replace('<\[php\]('.get_ex('[/php_]').')\[/php\]>e',
'"<blockquote><pre>".htmlentities_rev("\1")."</pre></blockquote>"', $text);
 
Gumbo hat gesagt.:
Probier mal Folgendes:
PHP:
$text = eregi_replace('<\[php\]('.get_ex('[/php_]').')\[/php\]>e',
'"<blockquote><pre>".htmlentities_rev("\1")."</pre></blockquote>"', $text);

funktioniert leider immer noch nicht, nun schreibt er mir die Funktion ganz frech mit rein :confused:

EDIT: Hach ich könnte dich abknutschen ;-)
Hab mir grade nochmal angeschaut was du da fabriziert hast und versucht daraus schlau zu werden...
Da fielen mir plötzlich diese komischen < und >e am Anfang und Ende des Suchmusters auf und ich denke du meintest preg_replace();

PHP:
$text = preg_replace('<\[php\]('.get_ex('[/php_]').')\[/php\]>e',
'"<blockquote><pre>".highlight_string(htmlentities_rev("\1"),TRUE)."</pre></blockquote>"', $text);

so funktioniert alles super, ich danke dir vielmals, hast mir viel Arbeit ersparrt ^^

:rtfm:
 
Zuletzt bearbeitet:
Dafür hat er ja den Link eingebaut das man es nachlesen kann... o.O

e

Wenn dieser Modifikator gesetzt ist, macht preg_replace() in der Ersetzungszeichenkette eine normale Ersetzung von Rückrefenzen, wertet sie als PHP-Code aus und verwendet das Ergebnis um damit die gesuchte Zeichenkette zu ersetzen. Einfache und doppelte Anführungszeichen werden in den ersetzten Rückreferenzen mit einem Backslash maskiert.

Dieser Modifikator wird nur von preg_replace() verwendet; von anderen PCRE-Funktionen wird er ignoriert.

Anmerkung: Dieser Modifikator steht in PHP 3 nicht zur Verfügung.

Also ja, eval.
 
hab ich nach dem posten dann auch gesehn ^^, blöderweise kann man hier nur seine einträge editieren und nicht löschen...
 
Zurück