PHP-Friends

Erweiterte/Flexible PHP BBCode Klasse

by Marvin Strauch on Nov.27, 2009, under PHP

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.


Antwort schreiben

Kommentarlinks könnten nofollow frei sein.

Du suchst nach etwas?

Blog durchsuchen:

Du hast immer noch Wünsche oder Anregungen? Hinterlasse uns einfach einen Kommentar und wir werden uns darum kümmern.

Besucht auch unsere Partner

Einige empfohlene Links:

    Archive

    Alle Einträge nach dem Alter sortiert:

    Blog Top Liste - by TopBlogs.de blogoscoop Bloggeramt.de blog-o-rama.de Blogverzeichnis Blogverzeichnis - Blog Verzeichnis bloggerei.de BloggerAlarm Topliste
    Blogkatalog & Blogverzeichnis Suchmaschinenoptimierung mit Ranking-Hits