highlight_string wenn Code zwischen [code] [/code]

partykiller

Grünschnabel
Hi,
ich habe folgendes Problem

Ich möchte alles was zwischen [ code ] und [ /code ] steht mit highlight_string bearbeiten und das dann zwischen <div> und </div> ausgeben. Der Text der Nicht innerhalb von [ code ] und [ /code ] steht soll nicht mit highlight_string bearbeitet werden.

Ich weiß das das mit Regulären Audrücken geht nur leider kapier ich das irgendwie nicht.

Ich hoffe Ihr könnt mir irgendwie weiterhelfen.

Danke im vorraus.


PS: Es kann auch mehrmals einen Bereich mit [ code ] [ /code ] geben
 
Zuerst musst du natürlich das Zeugs zwischen den code-Tags herausfiltern. Dann muss man das ganze highlighten. Funktionen ausführen geht bei den RegExp (Regular Expressions, Reguläre Ausdrücke) mit dem Schalter e:
PHP:
$text = preg_replace("/(\[ code ])(.*)(\[\/code\])/eisU", "editphpcode('$2')", $text);
Nun brauchen wir noch die Funktion editphpcode(). Hier muss ein ob-Buffering erfolgen, weil die PHP-Funktion highlight_string den code direkt ausgibt:
PHP:
function editphpcode($phpc) {
 $phpc = str_replace("\\\"","\"",$phpc);
 $phpc = html_entity_decode($phpc);
 $phpc = trim($phpc);

 ob_start();
 $oldlevel=error_reporting(0);
 highlight_string($phpc);
 error_reporting($oldlevel);
 $buffer = ob_get_contents();
 ob_end_clean();

 return "<div>$buffer</div>";
}

OK, ich gibs zu, der zweite Teil der editphpcode Funktion is ausm WBB geklaut :rolleyes:
 
Fast perfekt, Nuinmundo.

Hier mal ein Aufruf mit einer korrekten Regexp (hat bei deinem Beitrag sicher wieder das Forum verhunzt):
PHP:
$text = preg_replace("/\\[code\\](.*)\\[\\/code\\]/eisU", "editphpcode('$1')", $text);

Und dann wäre noch zu erwähnen, dass highlight_string den übergebenen String wie eine PHP-Datei behandelt. D.h., alle Bereiche, die nicht in <? ?> stehen, werden auch nicht wie PHP-Code eingefärbt. Damit auch Code ohne <? ?> korrekt gehighlighted wird, setzt man vor dem Aufruf von highlight_string ein <? an den Anfang und ein ?> an das Ende des Strings. Nach dem Highlighten entfernt man diese dann wieder. Hier mal eine erweiterte Funktion:
PHP:
<?
function editphpcode($phpc)
{
	$phpc = str_replace("\\\\\\"","\\"",$phpc);
	$phpc = html_entity_decode($phpc);
	$phpc = trim($phpc);

	$tag = false;
	// Bei Bedarf PHP-Tag setzen...
	if (!strstr($phpc, "<?") && !strstr($phpc, "?>")) {
		$phpc = "<?\n".$phpc."\n?>";
		$tag = true;
	}
	
	ob_start();
	$oldlevel=error_reporting(0);
	highlight_string($phpc);
	error_reporting($oldlevel);
	$buffer = ob_get_contents();
	ob_end_clean();

	// ...und wieder entfernen
	if ($tag) {
		$buffer = str_replace("&lt;?", "", $buffer);
		$buffer = str_replace("?&gt;", "", $buffer);
	}
	
	return "<div>$buffer</div>";
}
?>

HTH

// edit: Eine Ironie des Schicksals, dass man an dieser Funktion auch gleich das Manko selbiger sieht: Steht jetzt im übergebenen String zwar ein <? und ein ?> in "" oder '', nicht aber außerhalb eines Strings, so kann man durch ein einfaches strstr nicht mehr feststellen, ob man jetzt <? ?> setzen muss oder nicht.
 
Zuletzt bearbeitet:
Die RegExp hat das Board zerhauen. (Ich wiess nicht, benutzen die hier stripslashes?)


Zu 2:
Mit ereg(), oder preg_match()?
 
Zurück