BBCode Syntaxhighlighting

Stelo

Erfahrenes Mitglied
Hallo,

ich woltle gern BBCodes für einen PHP-Code nutzen und dies dann farblich hervor heben, so wie das z.B. auch hier im Forum ist.
Ich habe im Internet dazu ein Tut gefunden und mir einen Code rauskopiert. Leider wird dabei nichts farbig dargestellt.

Vllt. kann mir ja hier jemand helfen, ich wäre sehr dankbar! :)

PHP:
<?php

$php_start = "<br><b><u>PHP</u></b>\n".
"<div style=\"border:solid 1px black; background-color:#ffffff; margin:0px auto; 

width:565px; overflow:auto;\">\n";
$php_end = "</div>\n";
$php = array();
// PHP Code zwischenspeichern, damit er nicht durch andere Funktionen (z.B. nl2br) 

verfälscht wird
preg_match_all("/\[php\](.*)\[\/php\]/siU", $text, $php);
foreach($php[0] as $key => $value){
// Im Text durch eine Variable ersetzen, um diese dann später wiederum durch den Code zu 

ersetzen
$text=preg_replace('#'.preg_quote($value, '#').'#','[ code=php ]'.$key.'[ /code ]',$text,1);
// Code highlighten
$php[1][$key] = highlight_string($php[1][$key], TRUE);
$php[1][$key] = $php_start.$php[1][$key].$php_end;
}
//.... andere Code
//... und Ende
//PHP Code wieder einfügen
foreach($php[1] as $key => $value)
    $text = preg_replace("/\[php\]".$key."\[\/php\]/siU", $value, $text);
Der Code wird auch in der div Box ausgegeben, aber halt nich farbig. :(
 
Probier mal Folgendes:
PHP:
function highlightPHP($code)
{
	ob_start();
	highlight_string($code);
	$retVal = ob_get_contents();
	ob_end_clean();
	return $retVal;
}

preg_replace('/\[php\](.+?)\[\/php\]/sie', '"<pre>".highlightPHP("\\1")."</pre>"', $data);
 
Ich habe dazu 2 Klassen kombiniert.
-> eine BBCode-Klasse (weiß den namen nichtmehr) und GeShi

Wie genau ich das gemacht habe (Quelltext) kann ich dir ja nachher mal posten wenn ich zu Hause bin und an die Daten komme. So kann ich auch dynamisch auf neue Sprachen reagieren. Das ganze habe ich in einem Div formaiert.

Wenn die dir Lösung von Gumbo schon reicht sag bescheid - dann suche ich nicht extra meine Beispiele noch raus!

lg
 
Danke für eure Antworten erst einmal.

Klein0r, von diesem GeShi habe ich schon gelesen, aber ich glaube fast, dass das im Moment noch zu umfangreich für mein eher kleines Projekt ist.

Gumbo, danke für den Code. Leider erhalte ich dabei einen Fehler, mit dem ich nicht viel Anfangen kann.
Notice: Undefined variable: eintrag in /var/www/web94/html/preview/cuyl/bbcode_ausgabe.php(3) : regexp code on line 2

Zeile 3 wäre das hier:
PHP:
$text = preg_replace('/\[php\](.+?)\[\/php\]/sie', '"<pre>".highlightPHP("\\1")."</pre>"',$text);
 
Klein0r, von diesem GeShi habe ich schon gelesen, aber ich glaube fast, dass das im Moment noch zu umfangreich für mein eher kleines Projekt ist.

Naja umfangreich... Es enthält einfach eine Sammlung mit allen gängigen Programmiersprachen. Kann man ja löschen. Die Klasse selbst dient nur dazu diese Informationen zu parsen. So kannst du selbst ganz einfach Dateien für eigene Programmiersprachen erstellen usw.

Was man nicht braucht lässt man weg. Funktioniert auf jeden Fall super und ich denke das kostet weniger Zeit und Schweiß als zu versuchen das ganze selbst zu implementieren. Denke ich...

Naja wie gesagt - ich habs dir angeboten und das Thema hier habe ich aboniert. Poste einfach wenn dich meine Lösung interessiert sonst lasse ich das ganze erstmal außen vor und halte mich hier raus ;)

lg
 
Na ja, Klein0r, da ich mit dem Code von Gumbo eh nicht klar komme, sollte ich das was du mir erklärt hast, vllt. doch einmal ausprobieren, so habe ich wenigstens gleich alle Sprachen unter einem Hut.
Ich würde mich also freuen, wenn du mir die Daten dazu einmal aussuchen könntest. :)
 
Dann hast du bei der Einbindung in dein Skript einen Fehler gemacht, das Beispiel von Gumbo funktioniert einwandfrei.
 
Ja aber komischer Weise wird mir ja ständig etwas von einer undefinireten Variable $eintrag erzählt, die weder ich, noch Gumbo in seinem Code stehen hat. Und das irritiert mich etwas ...
 
Gut also es geht los :)

Benötigt:
http://qbnz.com/highlighter/
http://www.christian-seiler.de/projekte/php/bbcode/download.html (ich nutze noch 0.3.1)

Dann gehts los mit der Deklaration der BBCode-Tags:
PHP:
$bbcode = new StringParser_BBCode();

// Code
$bbcode->addCode ('code', 'callback_replace', 'bb_highlight', array (), 'inline', array ('block', 'inline'), array ());
$bbcode->addCode ('CODE', 'callback_replace', 'bb_highlight', array (), 'inline', array ('block', 'inline'), array ());

function bb_highlight($action, $attributes, $content, $params, &$node_object) {
	
	if (isset($attributes['default']) && strlen($attributes['default']) >= 1) {
		// Sämtlichen HTML-Quelltext entfernen
		$ergebnis = str_replace('<br />','',$content);
		
		// Neues Objekt erstellen und Ausgeben
		$geshi = new GeSHi($ergebnis, $attributes['default']);
		return '<br /><div class="codeheader">'.ucfirst($attributes['default']).'-Code:</div><div class="code">'.$geshi->parse_code().'</div>';
	}
	else {
		return '<br /><div class="codeheader">Code:</div><div class="code">'.$content.'</div>';
	}
}

So wird also für jeden Code-Tag diese Funktion aufgerufen. (mit [code=php] oder [code=vbnet] - alle Sprachen im geshi-ordner)
Die beiden CSS-Styles stelle ich auch gerne noch zur Verfügung:
Code:
div.code, div.codeheader {
  width									:		440px;
  border								:		1px black dashed;
  padding-left							:		0px;
}

div.code {
  margin-top							:		0px;
  margin-bottom							:		5px;
  overflow								: 		auto;
  border-top							:		none;
  font-size								:		8pt;
  padding-top							:		5px;
  padding-bottom						:		5px;
  background-image						:		url(img/minipics/code_style.jpg);
  background-position                   :       top left;
  background-repeat                     :       no-repeat;
}

div.codeheader {
  margin-top							:		5px;
  margin-bottom							:		0px;
  font-weight							:		bold;
  padding-right							:		0px;
  background-color						:		#c0c0c0;
}

Wie das ganze fertig aussieht kannst du dir hier ansehen:
http://de.klein0r.de/tutorials-41.html (PHP)
http://de.klein0r.de/tutorials-2.html (vb.net)
http://de.klein0r.de/tutorials-35.html (Java)

lg - für Fragen bin ich immer da :D
 
Zurück