Highlight im BBCodefunktion einbinden

newwarrior

Erfahrenes Mitglied
Hi,

ich würde gerne die Highloghtfunktion in meine BBCodefunktion gerne einbinden. Nur weiß ich nicht wie. Wie kann ich es am besten machen?

PHP:
<?php 
$bbcode=preg_replace("/\[php\](.*?)\[\/php\]/si","\\1", $bbcode); 
?>

Aber ich möchte sie so einbinden, dass nicht der ganze Code gehighlightet wird sondern nur wirklich das in den [ php] steht.

Danke

hier der rest meiner Funktion:

PHP:
function bbcode ($bbcode) 
{ 

$bbcode = addslashes(htmlspecialchars(stripslashes ($bbcode))); 

$bbcode=preg_replace("/\[b\](.*?)\[\/b\]/si", "<b>\\1</b>", $bbcode); 
$bbcode=preg_replace("/\[php\](.*?)\[\/php\]/si","\\1", $bbcode); 
$bbcode=preg_replace("/\[i\](.*?)\[\/i\]/si", "<i>\\1</i>", $bbcode); 
$bbcode=preg_replace("/\[s\](.*?)\[\/s\]/si", "<s>\\1</s>", $bbcode); 
$bbcode=preg_replace("/\[u\](.*?)\[\/u\]/si", "<u>\\1</u>", $bbcode); 
$bbcode=preg_replace("/\[center\](.*?)\[\/center\]/si", "<center>\\1</center>", $bbcode); 
$bbcode=preg_replace("/\[url\](.*?)\[\/url\]/si", "<a href=\\1>\\1</a>", $bbcode); 
$bbcode=preg_replace("/\[code\](.*?)\[\/code\]/si", "<center><b>Code:</b><br><br><div style=\"text-align:left;border:1px solid black;font-size:11px;color:green;background-color:#ececec;width:500px;padding:5px;\"><i>\\1</i></div></center><br>", $bbcode); 
$bbcode=preg_replace("/\[img\](.*?)\[\/img\]/si", "<img src=\\1 border=\"0\">", $bbcode); 

$bbcode = nl2br ($bbcode); 

return $bbcode; 
}

Ich habe es bis jetzt nur hinbekommen, dass der ganze Text dadurch gejagt wird. Er soll es nur machen, wenn es wirklich den [ php] Tag enthält.
Und auch nur den Text der dann dazwischen steht
 
Kann ich es so machen:

PHP:
$regex = '/\[php\](.*)\[\/php\]/siU'; 
$text = preg_replace($regex, highlight('$1'), $text);
 
Ich hab als ich meine Website geschrieben hab, mangels Erfahrung, nicht mit RegEx gearbeitet.
Daher sieht das bei mir ungefaehr so aus:
PHP:
while ((strpos($messagetext,"[ url=")>-1) && (strpos($messagetext,"[ /url]")>-1))
	{
		$startpos=strpos($messagetext,"[ url=")+5;
		$endpos=strpos($messagetext,"]",$startpos);
		$url=substr($messagetext,$startpos,$endpos-$startpos);
		$startpos=$endpos+1;
		$endpos=strpos($messagetext,"[ /url]",$startpos);
		$urltext=substr($messagetext,$startpos,$endpos-$startpos);
		$codestring='[ url='.$url.']'.$urltext.'[ /url]';
		$textstring='<a href="'.$url.'">'.$urltext.'</a>';
		$messagetext=str_replace($codestring,$textstring,$messagetext);
	}
Ich stelle also fest wo das oeffnende Tag und wo das schliessende Tag sind und alles was dazwischen ist wird dann bearbeitet.
 
Also ich habe es jetzt so gemacht:

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

Aber ich bekomme nur Fehlermeldungen.

Wie kann ich den deine Funktion so umbauen, das ich sie mit dem Highlight benutzen kann?
 
Ungefaehr so:
PHP:
while ((strpos($messagetext,"[pgp]")!=false) && (strpos($messagetext,"[/pgp]")!=false))
	{
		$startpos=strpos($messagetext,"[pgp]")+5;
		$endpos=strpos($messagetext,"[/pgp]",$startpos);
		$phpcode=substr($messagetext,$startpos,$endpos-$startpos);
		$codestring='[pgp]'.$phpcode.'[/pgp]';
		$formattedcode=highlight_string($phpcode,true);
		$messagetext=str_replace($codestring,$formattedcode,$messagetext);
	}
Sorry, das Forum hat den Code zerwurstet. Ueberall wo jetzt pgp steht muss natuerlich php hin.
 
Könnte ich es jetzt so machen:

PHP:
function php ($php)
{
while ((strpos($php,"[pgp]")!=false) && (strpos($php,"[/pgp]")!=false)) 
    { 
        $startpos=strpos($php,"[pgp]")+5; 
        $endpos=strpos($php,"[/pgp]",$startpos); 
        $phpcode=substr($php,$startpos,$endpos-$startpos); 
        $codestring='[pgp]'.$phpcode.'[/pgp]'; 
        $formattedcode=highlight_string($phpcode,true); 
        $php=str_replace($codestring,$formattedcode ,$php); 
    } 

return $php;
}
 
Zuletzt bearbeitet:
Bei str_replace() hab ich noch vergessen $urlstring durch $formattedcode zu ersetzen.
Aber ansonsten sollte es gehen.

Ich werd meinen Code oben auch noch anpassen.
 
Hi


sorry das ich nochmal diesen Alten thread raus holle aber ich möchte etwas wissen.

[beachten] meine ahnung von PHP ist sehr gering[/beachten]

ich hätte einen Variablen mit Text und code der code ist durch [ C] [ /C] gekenzeichnet.

wie mache ich es jetzt mit dem code das ich den Text aus gebe und sobald etwas zwischen diesem steht das es mit gesondert ausgegeben wird?

edit habe jetzt folgenten code

PHP:
<?
include('geshi/geshi.php');

$source = '[ C]echo "hello";[ /C], world![ C] echo "du";[ /C]';

$language = 'php';
$path = 'geshi/';


function php ($php,$language,$path)
{
while ((strpos($php,"[ C]")!=false) && (strpos($php,"[ /C]")!=false)) 
    { 
        $startpos=strpos($php,"[ C]")+3; 
        $endpos=strpos($php,"[ /C]",$startpos); 
        $phpcode=substr($php,$startpos,$endpos-$startpos); 
        $codestring='[ C]'.$phpcode.'[ /C]'; 
        $formattedcode=$geshi = new GeSHi($phpcode, $language, $path); 
        $php=str_replace($codestring,$formattedcode ,$php); 
    } 

return $php;
}

echo php($source,$language,$path);


?>

will aber trozdem net gehen ;-(

mfg klo
 
Zuletzt bearbeitet:
Nabend,
dann solltest du dich mit der Dokumentation zu GeSHi beschäftigen, in der steht unter Punkt "2.3: Basic Usage" ein Beispiel zur Verwendung:
PHP:
<?php
// Use of GeSHi is very easy. Here's a simple example:
//
// Include the GeSHi library
//
include_once('geshi.php');

//
// Define some source to highlight, a language to use
// and the path to the language files
//
$source = '$foo = 45;
for ( $i = 1; $i < $foo; $i++ )
{
  echo "$foo<br />\n";
  --$foo;
}';
$language = 'php';
//
// Create a GeSHi object
//
$geshi =& new GeSHi($source, $language);

//
// And echo the result!
//
echo $geshi->parse_code();
?>

Wenn du was selbstgeschriebenes bevorzugst, dann musst du den zwischen den jeweiligen Tags stehenden Code herausfiltern (dafür stehen dir mehrere Möglichkeiten zur Auswahl, z.B. [phpf]preg_replace[/phpf], ggf. auch [phpf]preg_replace_callback[/phpf] oder mit einer Schleife und [phpf]strpos[/phpf] - beide Varianten wurden hier schon angeführt), highlighten (s. [phpf]highlight_string[/phpf]) und wieder in den Code setzen.

Um dir einen Ansatz zu geben:
PHP:
function highlight_php($source) {
    // 1. filtern
    $match_count = preg_match_all('#\[php\](.*?)\[/php\]#si', $source, $match);
    
    for ($i = 0; $i < $match_count; $i++) {
        $before_replace = $match[1][$i];
        // 2. highlighten
        $after_replace = highlight_string($match[2][$i], true);
        
        // 3. alten Code durch neuen, gehighlighteten Code ersetzen
        [...]

    }
    
    [...]    

}

Gruß
Marvin
 
Es geht auch viel einfacher:
PHP:
preg_replace('<\[php\](.*?)\[/php\]>eis', '"<pre>".highlight_string("\1", true)."</pre>"', $string)
Falls deine PHP-Version älter als 4.2.0 ist, würdest du aufgrund des Fehlens des zweiten Parameters eine zusätzliche Funktion benötigen.
 

Neue Beiträge

Zurück