Guten Morgen :)

Nach meiner ersten, meiner Meinung nach, etwas missratenen “einfachen” PHP BBCode Klasse, wollte ich diese etwas erweitern und verbessern. Dies habe ich erreicht, indem man nun eigene BBCodes in den Parser laden kann, was die ganze Klasse flexibler gestaltet. Außerdem hab ich die alten Klassenstruktur etwas verändert, obwohl ich mit der aktuellen auch nicht richtig zufrieden bin. Aber es sollte ja nur ein “Upgrade” für die alte PHP BBCode Klasse sein und keine “Neuentwicklung”. Genug geredet hier ist sie, wie immer schlecht dokumentiert:

Erweiterte/Flexible PHP BBCode Klasse(Code)

<?php

class BBCodeParser
{
	private $BBCodesDefault="";
	private $BBCodesExtra="";
	private $rawText;

	public function __construct()
	{
		if(!isset($this->BBCodesDefault) OR !isset($this->BBCodesExtra))
		{
			trigger_error("Es fehlen wichtige Variablen! Bitte kontrollieren Sie die Klasse.");
		}
		$this->addDefaultBBCodes();
	}

	private function addDefaultBBCodes()
	{
		$this->BBCodesDefault = array("b" => array("/\[b\](.*)\[\/b\]/isU" => "<b>$1</b>"),
								      "i" => array("/\[i\](.*)\[\/i\]/isU" => "<i>$1</i>"),
								      "url" => array("/\[url\=(.*)\](.*)\[\/url\]/isU" => "<a href=\"$1\">$2</a>"),
								      "youtube" => array("/\[youtube\](.*)\[\/youtube\]/isU" => "<object width=\"560\" height=\"340\"><param name=\"movie\" value=\"http://www.youtube.com/v/$1\"></param><param name=\"allowFullScreen\" value=\"true\"></param><param name=\"allowscriptaccess\" value=\"always\"></param><embed src=\"http://www.youtube.com/v/$1\" type=\"application/x-shockwave-flash\" allowscriptaccess=\"always\" allowfullscreen=\"true\" width=\"560\" height=\"340\"></embed></object>"),
								      "img" => array("/\[img\](.*)\[\/img\]/isU" => "<img src=\"$1\" alt=\"\" title=\"\" />"));
	}

	public function addExtraBBCode($name, $bbCodePattern, $htmlCodePattern)
	{
		if(!isset($this->BBCodesExtra[$name]))
		{
			$this->BBCodesExtra[$name] = array($bbCodePattern => $htmlCodePattern);
		}
		else
		{
			trigger_error("BBCodename existiert bereits");
		}
	}

	private function parseExtraCode()
	{
		if(!is_array($this->BBCodesExtra)) return $this->rawText;

		foreach($this->BBCodesExtra as $BBCode => $array)
		{
			foreach($array as $BBCodePattern => $htmlPattern)
			{
				$this->rawText = preg_replace($BBCodePattern, $htmlPattern, $this->rawText);
			}
		}
		return $this->rawText;
	}

	private function iniParse($rawText)
	{
	$this->rawText = $rawText;
		foreach($this->BBCodesDefault as $BBCode => $array)
		{
			if(stripos($this->rawText, "[".$BBCode."]") !== FALSE && stripos($this->rawText, "[/".$BBCode."]") !== FALSE)
			{
				return true;
			}
			continue;
		}
		if(is_array($this->BBCodesExtra))
		{
			foreach($this->BBCodesExtra as $BBCode => $array)
			{
				if(stripos($this->rawText, "[".$BBCode."]") !== FALSE && stripos($this->rawText, "[/".$BBCode."]") !== FALSE)
				{
					return true;
				}
				continue;
			}
		}

		return false;
	}

	private function parseCode()
	{
		if($this->rawText == "")
		{
			trigger_error("Diese Funktion muss erst durch iniParse() initialisert werden!");
		}

		foreach($this->BBCodesDefault as $BBCode => $array)
		{
			foreach($array as $search => $html)
			{
				$this->rawText = preg_replace($search, $html, $this->rawText);
			}
		}

		return $this->rawText;
	}

	public function Parser($rawText)
	{
		//$this->rawText = htmlentities($rawText);
		if(!$this->iniParse($rawText)) return $this->rawText;
		$this->parseCode();
		$this->parseExtraCode();
		return $this->rawText;
	}
}
?>

Eine Demo gibt es hier zu sehen: DEMO. Obwohl man natürlich nur den geparsten Text sehen kann, also bringt es nicht viel.


Erweiterte/Flexible PHP BBCode Klasse – DEMO(Code)

<?php

include_once("./BBCode2.class.php");

// Parser wird initialisiert
$bbcode = new BBCodeParser();

//Test mit BBCode
$text = "[URL=http://php-friends.de]PHP-Friends[/URL][I][B]Text[/B][B]Text2[/B][/I][youtube]gUeeIjyI7QQ[/youtube]<br />";

// Text ohne BBCode
$text2 = "ABC<br />";

// Eigenen BBCode einfügen

$bbcode->addExtraBBCode("h1", "/\[h1\](.*)\[\/h1\]/isU", "<h1>$1</h1>");

// Wird der eigene BBCode geparst?
$text3 = "[h1]Marvin[/h1]";

//Ausgabe
echo $bbcode->Parser($text3);
echo $bbcode->Parser($text2);
echo $bbcode->Parser($text);
?>

Bei Anregungen und/oder Kritik bitte das Kommentarsystem nutzen; E-Mail ist natürlich auch okay.