Funktion für Code-Syntax-Highlighting

Johnnii360

Erfahrenes Mitglied
Grüßt euch!

Ich habe hier eine Funktion um in einem Forumspost Code zu highlighten. Jetzt ist nur das Problem, dass ich bereits eine Funktion für den Postingtext angewandt habe (formattext() > für Textformationen).

So sieht meine Funktion aus:

PHP:
function phpCode($code)
{
	$code = highlight_string($code, true);
	$code = explode("<br />", $code);
	
	$i = "1";
 
 	echo'<strong>PHP-Code:</strong><br>';
	echo'<div id="Box">';
	echo'<div class="Rahmen">';
	echo'<div class="iFrame">';
 	echo'<code>';
	
	foreach ($code as $line => $syntax)
	{
		echo $syntax.'<br>';
		$i++;
	}
	
	echo'</code>';
	echo'</div>';
	echo'</div>';
	echo'</div>';
	
	return;
}

Ich weiß nicht wie ich das lösen kann, und ich weiß auch nicht ob eine Funktion in einer Funktion funktioniert? Es soll ja schließlich nicht der gesamte Text highlightet werden, sondern nur der Text zwischen [ PHP ][ /PHP ] oder [ CODE ][ /CODE ].

Ich würde mich sehr über eure Hilfe freuen!
 
PHP:
$string = '[ php]$test = "hallo";\n echo $test[/php ]';
$pattern = "#^\[php\](.*?)\[/php\]$#s";

preg_match_all($pattern, $string, $arr);
print_r($arr);

Spontan sowas hier...

Aber ich hab nicht wirklich viel Ahnung von regulären Ausdrücken, vielleicht hat da jemand etwas besseres oder kann diesen hier optimieren :o


/Edit: Musste die [php ] Tags im String mit einem Leerzeichen versehen.
 
Sieht schonmal gut aus. Nun muss ich das ganze wahrscheinlich auch noch mit einer if-Abfrage koppeln oder?
 
Irgendwie zeigt mir dieser Code hier nur Müll an:

PHP:
$string = $text;
		$pattern = "#^\[php\](.*?)\[/php\]$#s";

		preg_match_all($pattern, $string, $arr);
		
		if(count($arr) > 0)
		{
			$string = highlight_string($string, true);
    		$string = explode("<br />", $string);
			
			$i = "1";
			
			$string = str_replace("[ PHP]","<strong>PHP-Code:</strong><br><div id=\"Box\"><div class=\"Rahmen\"><div class=\"iFrame\"><code>",$string);
			
			foreach ($string as $line => $syntax)
			{
				echo $syntax.'<br>';
				$i++;
			}
			
			$string = str_replace("[/ PHP]","</code></div></div></div>",$string);
		}
 
Zuletzt bearbeitet:
Setze einfach das Suchmuster mit der ursprünglichen Funktion ein:
PHP:
preg_replace('#\[php\](.*?)\[/php\]#es', 'phpCode("\1")', $string)
In der phpCode()-Funktion muss nun nur noch statt die Daten auszugeben sie in einer Variable sammeln und den Wert dann per return zurück geben.
 
Na endlich geht Tutorials.de wieder...

Du kannst dir auch lokal einen Test-Webserver einrichten. Dank XAMPP und Co. ist das ganz einfach.
Ich weiß, ich verwende immer WAMP-Server von http://www.wampserver.com . Nur hab ich das noch nicht auf meinen 8GB USB-Stick von Transcend gepackt, mit diesem ich immer arbeite.

Aaalsoo...

So sieht der (Test-)Code momentan aus:

PHP:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

function phpCode($code)
{
	$code = highlight_string($code, true);
	$code = explode("<br />", $code);
	
	$i = "1";
 
	$code = '<strong>PHP-Code:</strong><br>';
	$code = '<div id="Box">';
	$code = '<div class="Rahmen">';
	$code = '<div class="iFrame">';
	$code = '<code>';
	
	foreach ($code as $line => $syntax)
	{
		$code = $syntax.'<br>';
		$i++;
	}
	
	$code = '</code>';
	$code = '</div>';
	$code = '</div>';
	$code = '</div>';
	
	return $code;
}
	
function formattext($blubb)
{	
	$blubb = nl2br($blubb);
	$blubb = preg_replace('#\[PHP\](.*?)\[/PHP\]#es', 'phpCode("\1")', $blubb);
	
	return $blubb;
}

$test = "[B ]Fett[/B ]
[PHP ]<?php 
	echo \"Ein String\" 
?>[/PHP ]";

echo formattext($test);
?>
<style type="text/css">
<!--

#Box
{
	border: 1px solid #CCCCCC;
	width: 90%;
	height: auto;
	background: #F5F5F5;
}

.Rahmen
{
	padding: 10px;
}

.iFrame
{
	overflow: auto;
	width: 90%;
	height: auto;
}

-->
</style>

Ich habe auch schon versucht die Style-Elemente mit einer anderen Var und einem weiteren return() auszugeben. Bringt aber nichts.

Die Ausgabe sieht so aus:

Warning: Invalid argument supplied for foreach() in K:\Arbeitsmaterial\Webpublishing\Testarea\test9.php on line 18
[B ]Fett[/B ]

"$code .=" hat auch nichts geholfen. Da wird dann nichts ausgegeben.

Hinweis: Ich hab beim Code absichtlich Leerzeichen hinzugefügt.
 
Folgendes sollte ausreichen:
PHP:
function phpCode( $code )
{
	$retVal = '<pre><code class="php">';
	$retVal .= highlight_string($code, true);
	$retVal .= '</code></pre>';
	return $retVal;
}
 
Zurück