PHP Platzhalter mit Include Befehl ersetzen -> Parsen?

solar22

Mitglied
Einen schönen guten Morgen,

ich hab in meinem HTMLCode folgende Platzhalter definiert:
Code:
[plugin]ViewArticle[/plugin]

Jetzt möchte ich, das PHP den Platzhalter sucht und durch einen include() Befehl ersetzt, das klappt auch soweit ganz gut in meiner Templateklasse:
PHP:
      $bbcode = new BBCodeParser();
      $bbcode->addExtraBBCode("plugin", "/\[plugin\](.*)\[\/plugin\]/isU", "<?php include'$1.php';?>");
      $text = $bbcode->Parser($text);

Nur parst er den Code nicht?
Im Quelltextmodus vom FF wird der PHPCode rosa angezeigt.
Wie bringe ich PHP dazu, das er den Code parst?

Gruß und einen schönen Samstag wünscht euch,

solar22
 
Welcher Code wird nicht geparst?

Außerdem solltest du etwas mehr code zeigen, denn der Interessante Teil fehlt (wo die Funktion im Kontext steht usw.)

Mit eval kann man PHP-Code ausführen, auch wenn ein String bereits geparst wurde (Stichwort.: Ausgabepuffer)
 
Hallo,
entschuldige die späte Antwort -> Schule.

Momentan nutze ich noch diesen BBCode Parser:
PHP:
<?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;
	}
}
?>

Aus der mySQL DB wird der Inhalt der Seite gelesen, zB:
Code:
Hallo ich bin <b>Peter</b>,<br/>
hier ein paar News von mir: <br />
[plugin]ViewArticle[/plugin]

Nun soll, das [plugin]ViewArticle[/plugin] durch ein <?php include 'plugins/ViewArticle.php'; ?> ersetzt werden.
Klappt auch soweit ganz gut, nur parst er das ganze nicht.
Die TPL Engine ist recht simpel, also kein Smarty oder so.
 
Zuletzt bearbeitet:
Mit dem bbcode parser kannst du das eher nicht lösen da der parser nur bbcode elemente in html elemente umwandelt und du willst ja ein PHP-File einbinden.
Ein Include bedeuted das die datei auch an der stelle ausgeführt wird. In deinem Beispiel sollte das einen Fehler erzeugen.
Du wirst wohl um einen eigenen Parser nicht herumkommen.
Dazu brauchst du preg_match() und ziehst dir den Pluginnamen heraus.
Mit dem kannst du dann an gewünschter Stelle deine PHP-File einbinden.
 
Nun, ich hab jetzt mal das hier geschrieben, anstatt der BBCoder Parser Geschichte:

PHP:
    $text = preg_replace('/\[plugin\](.*?)\[\/plugin\]/', "<?php include'\1.php'; ?>", $text);
Trotzdem wird das ganze nicht geparst.
Die Frage, die ich mir stelle, wie bekomm ich PHP nun dazu, das er den Code mit parst?
 
Du schreibst ganz oben das du im HTML Code einen Platzhalter definiert hast. Bedeutet das auch das die Datei die Endung HTML hat? Dann kann PHP nicht geparst werden.
 
Nun, ich hab jetzt mal das hier geschrieben, anstatt der BBCoder Parser Geschichte:
PHP:
    $text = preg_replace('/\[plugin\](.*?)\[\/plugin\]/', "<?php include'\1.php'; ?>", $text);
Trotzdem wird das ganze nicht geparst.
Mh du solltest meinen Beitrag ganz lesen....
Ein Include führt die PHP-File an exakt der Stelle aus wo du den Include hinschreibst....
Das ist wie als ob du den gesamten Inhalt kopierst und statt <?php include'\1.php'; ?> einfügst.
Es kann also so nicht gehen.
Wie schon oben beschrieben hole dir den Plugin Namen und setze dein Include an die richtige Stelle.
 
Zuletzt bearbeitet:
Der HTML Code wird dynamisch aus einer mysql Tabelle geladen.
Der Platzhalter soll dann ersetzt werden und dann geparst werden.
 
@Da_Chris
Der include soll auch genau da ausgeführt werden, wo der Platzhalter steht.
Und der php include() wird ja auch korrekt umgewandelt.
Das ist wie als ob du den gesamten Inhalt kopierst und statt <?php include'\1.php'; ?> einfügst.
Es kann also so nicht gehen.
Diesen Teil versteh ich nicht.
Wie gesagt, er macht schon aus
HTML:
[plugin]ViewArticle[/plugin]
das hier:
<?php include 'plugins/ViewArticle.php'; ?>
 
Ich seh grad ich hab deinen Code nicht ganz genau angesehen.
Du hast ja "" um deine Include Anweisung gepackt.

Dann sieht die Sache anders aus (aber leider immer noch nicht richtig)
Was bei dir passiert er schreibt die include anweisung in deinen html code.
Ich weis nicht wie du die Ausgabe machst aber damit es funktioniert müsstest du die Ausgabe des geänderten html codes in eval() packen.
Also
PHP:
eval($text);
 
Zurück