eregi_replace mit einer eigenen Funktion

Danielku15

Erfahrenes Mitglied
Hallo.

Ich versuche gerade meinem BB-Code Script ein Syntax Highlightning mittels GeShi zu verpassen. Nur das Problem ist folgendes. Ich habe eine Funktion: highlight_code für das Highlightning:
PHP:
function highlight_code($source, $language) {
    $geshi =& new GeSHi($source, $language);
    $geshi->enable_line_numbers('GESHI_NORMAL_LINE_NUMBERS');
    return $geshi->parse_code();
}

Und nun will ich über eregi_replace einen BB-Code den Code dazwischen Highlighten:
PHP:
function bbcode($text) {
     $suche = '\\[PHP\\](.*)\\[\\/PHP\\]';
     $ersatz = highlight_code('\\1', 'php');
     $text = eregi_replace($suche, $ersatz, $text);
}

Aufruf:
PHP:
$text = "<?php echo "hallo"; ?>";
echo bbcode($text);

Ausgabe:
\\1

Hat da jemand eine Idee wie ich das Problem lösen könnte?

greez daniel
 
Ich habs nun mal über die preg_replace Funktion probiert. Anscheinend mach ich was falsch. Denn ich habe nun 2 Probleme.
1. Es wird der BB-Code mit ausgegeben
2. Der Code wird nicht mehr formatiert. Ich bekomme wieder nur eine Ausgabe als ob ich den Code mit echo ausgebe. Mit htmlentities wird er dann zu sichtbarem Text aber das Syntax-Highlightning ist futsch. Die Highlightfunktion ist in Ordnung. Bei direktem Aufruf funktioniert sie. Was mache ich falsch?

Hier meine derzeitige Abfrage:
PHP:
$text = preg_replace("/\[PHP\](.*?)\[\/PHP\]/e", "highlight_code('\\1', 'php')", $text);
 
Probier mal Folgendes:
PHP:
<?php

	function highlight_code( $source, $language )
	{
		$geshi =& new GeSHi($source, strtolower($language));
		$geshi->enable_line_numbers('GESHI_NORMAL_LINE_NUMBERS');
		return $geshi->parse_code();
	}

	function bbcode( $string )
	{
		$pattern = '/\[(php|css|html)\](.+?)\[\/\1\]/eis';
		return preg_replace($pattern, 'highlight_code("\2", "\1")', $string);
	}

?>
 
Gut danke. Der Code funktioniert. Nun habe ich ein logisches Problem. Ich lasse über htmlentities die HTML-Tags umwandeln. Früher sah die Funktion so aus:
PHP:
function bbcode($text)
{
// HTML Tags umwandeln
$text = htmlentities($text); 
// Umbrüche umwandeln
$text = nl2br($text);
// Unnötige Slashes entfernen
$text = stripslashes($text);

//kursiv
$text = eregi_replace("\\[i\\](.*)\\[/i\\]","<i>\\1<\\/i>",$text);

// Weitere Tags und smilies //
...
}
?>
So weit so gut. Jetzt hab ich die Highlight Funktion dazugefügt:
PHP:
<?php
include_once('geshi.php');

function highlight_code($source, $language) {
    $geshi =& new GeSHi($source, $language);
    $geshi->enable_line_numbers('GESHI_NORMAL_LINE_NUMBERS');
    return $geshi->parse_code();
}

function bbcode($text)
{
// HTML Tags umwandeln
$text = htmlentities($text); 
// Umbrüche umwandeln
 $text = nl2br($text);
// Unnötige Slashes entfernen
$text = stripslashes($text);

//kursiv
$text = eregi_replace("\\[i\\](.*)\\[/i\\]","<i>\\1<\\/i>",$text);
// PHP Code
$text = preg_replace('/\[(php)\](.+?)\[\/\1\]/eis', 'highlight_code("\2", "\1")', $text);

//kursiv
$text = eregi_replace("\\[i\\](.*)\\[/i\\]","<i>\\1<\\/i>",$text);

// Weitere Tags und smilies //
...

Das Problem ist wenn ich den Code vor dem htmlentities Highlighte werden die Formatierungs Tags auch umgewandelt. Wird der Code nach dem htmlentities gehighlightet sind werden die Klammern etc. im Code als HTML-Kürzel (&amp;) angezeigt.

greez daniel
 
Zurück