BBCode schreiben

Hi, also ich versuche gerade für unser cms ein eigenes bbcode plugin zu schreiben.

der relevante teil der function ist folgender:

Code:
$text = str_replace($bbcode,$htmlcode,$text);
return $text;

$bbcode ist ein array der bbcode elemente aus einer mysql datenbank und $htmlcode der entsprechende html text.

Aber das funktioniert nicht, zum Beispiel hatte ich einen Text und habe in die Datenbank ein Test bbcode eingefügt.

Code:
Der Text war ein toller dummy text der [FAT]hier fett geschrieben sein soll [/FAT]

[FAT] und [/FAT] stehen in der Datenbank -> ihnen werden jeweils <b> und </b> zugewiesen, was mache ich falsch?
 
BB-Codes parsen ist - insbesondere wenn es dann auch noch um Verschachtelungen geht - weitaus weniger trivial, als du wahrscheinlich annimmst... und mit str_replace() ist man sowieso ein wenig eingeschränkt... du musst quasi schon voraussetzen, dass der User sauberen BB-Code schreibt, um später auch ein sauberes Ergebnis zu bekommen....

für BB-Code gibt es eine recht ausgereifte Parser-Klasse:
http://www.christian-seiler.de/projekte/php/bbcode/

schau dir die doch einfach mal an...
 
Hi,

für solche Fälle sollte dir ereg_replace weiterhelfen. Schau dir mal folgenden Schnipsel an:

Code:
	function bb_FAT_replace($string)
	{
		$string = ereg_replace("\[FAT\]", "<b>", $string);
		$string = ereg_replace("\[\/FAT\]", "</b>", $string);
		return $string;
	}

	$entry = "hier gibt es auch [FAT]fetten[/FAT] Text";
	echo bb_FAT_replace($entry);

für den anderen Weg musst du nur noch die entgegengesätzten Fälle entwerfen.

Das ganze wird hier über Regular Expressions umgesetzt, daher müssen bestimmte Zeichen per Backslash escaped werden.
 
kann ich die expressions wie "\[FAT\]" auch in ne db schreiben und in ein array laden und dann abfragen?

weil sonst müsste ich ja für jeden ausdruck den ich verändern will den quellcode verändern.
 
kannst du sicherlich auch... hier ist aber wieder ein ähnliches Problem wie bei deinem str_replace:

entweder du schreibst einen RegExp, der sauber überprüft, ob ein Anfangs- und ein End-Tag existieren
Nachteil: es wird verdammt hässlich mit Verschachtelung von BB-Codes

oder du schreibst das so, wie moveax1 geschrieben hat (dann kannst du aber genauso gut bei deinen str_replace bleiben)
Nachteil: du musst davon ausgehen, dass der Verfasser des Textes mit BB-Code auch wirklich sauberen BB-Code schreibt und alles was er öffnet wieder schließt, etc.
ansonsten wird eben ungültiger HTML-Code erzeugt, der dir dein ganzes Seiten-Layout versauen kann....
(wenn z.B. Tags geöffnet werden, aber nicht mehr geschlossen)

Daher mein Tipp mit dem BB-Code- PARSER, weil der auch Verschachtelungen und so problemlos mitmacht.

Denn wenn du nur mit str_replace arbeitest oder mit derartig einfachen RegExp's wie von moveax1 gepostet, dann kannst du genauso gut einfach mit EINEM regulären Ausdruck abfragen, dass nur bestimmte HTML-Tags erlaubt sind und alle HTML-Tags, die z.B. nicht <b>, <u> oder <i> sind sollen durch die Entities ersetzt werden (<b> etc.)
 
entweder du schreibst einen RegExp, der sauber überprüft, ob ein Anfangs- und ein End-Tag existieren
Strenggenommen eigentlich nur bis zur einer bestimmten Tiefe möglich. Und die Tiefe wird man auch fest einkodieren müssen - iowas in der Art: "(BBcode_open zeichen* BBcode_close)" | ("BBcode_open zeichen* BBCode_open zeichen* BBCode_close zeichen* BBCode_close)"

Aber ein simpler Validierer ist imho nicht soo schwer:
man braucht nur ein assoziatives Array mit Open-Close gültigen BB-Codes:
Code:
1.solange zeichen da sind -> lese_zeichen:
  wenn zeichen=Open_BB_Code push stack Entsprechender_Close_BB_Code
   wenn zeichen=Close_BB_Code  muss auch  pop stack=Close_BB_Code sein, sonst fehler
   wenn zeichen was anderes gehe zu 1.

keine_zeichen_da: ist stack nicht leer->fehler
 
Zurück
Oben