Inhalt von bbcode in Variable speichern

Hookah

Erfahrenes Mitglied
Abend,

Ich hab da ein Problem und zwar geht es um folgendes.

Ich bin dabei ein Forum zu machen. Das umwandeln von bbcodes ist kein Problem. Jetzt möchte ich einen Button reinmachen für PHP Codes und diese sollen hervorgehoben werden mit syntax hilightning. Was sich bei mir nur als Problem darstellt ist das der gesamte Text in $text steht, eben auch der PHP Code . Ich muss nur alles was zwischen [ PHP] und [ /PHP] speichern und wieder an die richtige stelle einfügen können. Leider hab ich gar keine Ahnung wie ich dies realisieren solll. Für jede Idee und Anregung bin ich dankbar.

Hook
 
ich verstehe nicht ganz was du meinst, aber warum machst du dies nicht einfach mit preg_replace ?
Wieso musst du dies zwischenspeicher, das macht preg_replace doch automatisch.
Schau dir am besten mal Regex an.
 
Es geht um das Syntax Hilighten. Wenn ich es auf den gesamten Text machen würde dann würde ja auch Code ausserhalb der PHP Codebox farbig dargestellt und das möchte ich nicht. Mit preg_replace ersetz ich schon die Zeichen . Kann ich innerhalb diese Prozesses auch das mit dem hilighten machen?
 
Du kannst das so machen. Gegebener Fall: Wir haben eine Funktion string highlight($str):

PHP:
$text = preg_replace('/\[php\](.*?)\[\/php\]/ise', highlight('$1'), $text);


Der Modifier 'e' sorgt dafür, das die Funktion highlight aufgerufen wird. Wenn ich mich nun nich ganz täusche, sollte das so zu bewerkstelligen sein.

Grüße
 
Ich habe es so probiert wie du sagtest, nur eben mit highlight_string und so
PHP:
$frage_text = preg_replace('#\[php\](.*?)\[\/php\]#ise', highlight_string('\1'), $frage_text);
Funktionierte aber auch nicht. Es wird zwar [ php] ersetzt aber als ausgabe stand oben auf der Seite nur $1 oder eben \1 . Es stand noch nichteinmal im Post sondern darüber.
 
highlight_string() liefert keinen Wert zurück (void), daher kann das so nicht funktionieren. highlight_string gibt den formatierten PHP-Code direkt an stdout (in dem Falle der Stream zum Webserver). Wenn du das abfangen willst, musst du dir eine Funktion schreiben:

PHP:
function highlight_php( $str )
{
    ob_start();
    highlight_string( $str );
    $code = ob_get_contents();
    ob_end_clean();

    return $code;
}

Anschließend baust du die Funktion in dein regex ein.

PHP:
$frage_text = preg_replace('#\[php\](.*?)\[\/php\]#ise', highlight_php('\1'), $frage_text);

echo $frage_text;

Achja, als Beweis für meine Aussage das Manual: http://de.php.net/manual/de/function.highlight-string.php

void highlight_string ( string $str )
 
Wenn ich es so mache wie du es sagst kommt :

Parse error: parse error, unexpected '<' in /var/www/web5/html/forum/thread.php(89) : regexp code on line 1

Fatal error: preg_replace(): Failed evaluating code: <code><font color="#000000"> php </font> </code> in /var/www/web5/html/forum/thread.php on line 89

Damit kann ich leider nichts anfangen. Es kommt auch nur wenn [ php] ddd [/ php] vorkommt.
 
PHP:
function highlight_php( $str )
{
	ob_start();
	highlight_string($str);
	return '<pre class="php">'.ob_get_clean().'</pre>';
}

preg_replace('/\[php\](.*?)\[\/php\]/ise', 'highlight_php("\1")', $string)
 
Sorry, bin schon ein wenig eingerostet, was execute im preg_* angeht, weil man das eigentlich nicht machen sollte:

PHP:
$frage_text = preg_replace('/\[php\](.*?)\[\/php\]/ise', 'highlight_php("$1")', $frage_text);
 
Gibt doch noch was. $test wird garnicht angezeigt. Ich hab schon mit
preg_replace was zu machen aber ich schaffte es nicht. Jemand eine Idee?
 
Zuletzt bearbeitet:
Zurück