Fehler im BBCode und ich finde ihn nicht

Im Endeffekt ist BB-Code ein Feature für User, welche kein HTML können.

Die ganze Verarbeitung liesse sich genausogut auf HTML-Code anwenden.
Allerdings.... das will ich nicht bestreiten, ist es einfacher, ein Dutzend BB-Tags in HTML-Code umzuwandeln, als 10 Dutzend(oder mehr) unerlaubte HTML-Codes zu entschärfen :-)
 
Folgenden String habe ich eingegen:
Code:
[color=#ff0000_][font=courier_][size=30_]mein profil[/size_]
   [:05:][:10:][:32:][:36:][:39:]
   [img_]http://localhost/website/bilder/smilies/smile40.gif[/img_]
   [url_]http://www.jan-bracker[/url_]
   [url=http://www.jan-bracker_]website[/url_]
 [b_]fett[/b_][i_]kursiv[/i_][u_]unterstrichen[/u_][/font_][/color_]
die unterstriche habe ich nur reingeschrieben damit er es jetzt nicht in BBCode übersetzt.

Folgendermassen verarbeitet:
PHP:
<?php
     $profil_beschreibung = nl2br($profil_beschreibung);
     	$profil_beschreibung = bb_code('b', $profil_beschreibung);
     	$profil_beschreibung = bb_code('i', $profil_beschreibung);
     	$profil_beschreibung = bb_code('u', $profil_beschreibung);
     	$profil_beschreibung = bb_code('url', $profil_beschreibung);
     	$profil_beschreibung = bb_code('img', $profil_beschreibung);
     	$profil_beschreibung = bb_code('smile', $profil_beschreibung);
     	$profil_beschreibung = bb_code('quote', $profil_beschreibung);
     	$profil_beschreibung = bb_code('size', $profil_beschreibung);
     	$profil_beschreibung = bb_code('font', $profil_beschreibung);
     	$profil_beschreibung = bb_code('color', $profil_beschreibung);
     ?>

Und hier noch die Funktion bb_code() :
PHP:
<?php
     function bb_code($bb_code, $string)
     	{
     		$pattern = Array();
     		$pattern['smile'] = '!\[:([0-9]{2}):\]!s';
     		$pattern['b']	 = '!\[b\](.*)\[/b\]!iUm';
     		$pattern['i']	 = '!\[i\](.*)\[/i\]!iUm';
     		$pattern['u']	 = '!\[u\](.*)\[/u\]!iUm';
     		$pattern['quote'] = '!\[quote\](.*)\[/quote\]!iUm';
     		$pattern['code']  = '!\[code\](.*)\[/code\]!iUm';
     		$pattern['size']  = '!\[size=([0-9]{2})\](.*)\[/size\]!iUm';
     		$pattern['font']  = '!\[font=([0-9a-z -_/\.]+)\](.*)\[/font\]!iUm';
     		$pattern['img']   = '!\[img\](.*)\[/img\]!iUs';
     		$pattern['color1'] = '!\[color=(#[0-9a-f]{6})\](.*)\[/color\]!iUm';
 		$pattern['color2'] = '!\[color=([black|maroon|green|olive|navy|purple|teal|silver|gray|red|lime|yellow|blue|fuchsia|aqua|white])\](.*)\[/color\]!iUm';
 		$pattern['url1'] = '!\[url\](http://[0-9a-z-_/%=&?\[\]#+:\.]+)\[/url\]!iUs';
 		$pattern['url2'] = '!\[url=(http://[0-9a-z-_/%=&?\[\]#+:\.]+)\](.*)\[/url\]!iUs';
     		
     		$replace = Array();
 		$replace['smile'] = '<img src=&quot;bilder/smilies/smile$1.gif&quot; alt=&quot;::$1::&quot;>';
 		$replace['b']	 = '<span class=&quot;fett&quot;>$1</span>';
 		$replace['i']	 = '<span class=&quot;kursiv&quot;>$1</span>';
 	 $replace['u']	 = '<span class=&quot;unterstrichen&quot;>$1</span>';
 		$replace['quote'] = '<br><span class=&quot;klein&quot;>Zitat:</span><br><div class=&quot;zitat&quot;>$1</div>';
 		$replace['code'] = '<br><span class=&quot;klein&quot;>Code:</span><br><div class=&quot;code&quot;>$1</div>';
 		$replace['size'] = '<span style=&quot;font-size:$1px;&quot;>$2</span>';
 		$replace['color'] = '<span style=&quot;color:$1;&quot;>$2</span>';
 		$replace['font'] = '<span style=&quot;font-family:$1:&quot;>$2</span>';
 		$replace['img'] = '<img src=&quot;$1&quot; alt=&quot;$1&quot;>';
 		$replace['color'] = '<span style=&quot;color:$2;&quot;>$4</span>';
 		$replace['url1'] = '<a href=&quot;$1&quot; target=&quot;_blank&quot;>$1</a>';
 		$replace['url2'] = '<a href=&quot;$1&quot; target=&quot;_blank&quot;>$2</a>';
     		
     		if($bb_code == 'url')
 			return preg_replace($pattern['url1'], $replace['url1'], preg_replace($pattern['url2'], $replace['url2'], $string));
     		else if($bb_code == 'color')
 			return preg_replace($pattern['color2'], $replace['color'], preg_replace($pattern['color1'], $replace['color'], $string));
     		else
 			return preg_replace($pattern[$bb_code], $replace[$bb_code], $string);
     	}
     ?>

So beim ausgeben des umgewandelten String ist halt font und color nicht übersetzt.

@Gumbo: :offtopic:
 
Zuletzt bearbeitet:
Du musst auch die Flag s setzen.

Der Punkt findet standardmässig alle Zeichen... ausgenommen den Zeilenumbruch.

Da sich font/color über mehrere Zeilen erstrecken, trifft der Ausdruck somit nicht zu.
Mit der Flag "s" findet der Punkt auch Zeilenumbrüche.
 
Sven Mintel hat gesagt.:
Im Endeffekt ist BB-Code ein Feature für User, welche kein HTML können.

Die ganze Verarbeitung liesse sich genausogut auf HTML-Code anwenden.
Allerdings.... das will ich nicht bestreiten, ist es einfacher, ein Dutzend BB-Tags in HTML-Code umzuwandeln, als 10 Dutzend(oder mehr) unerlaubte HTML-Codes zu entschärfen :-)
Weiterhin find ich das auch in sofern sinnvoll, dass dadurch die Moeglichkeit besteht auch mal HTML-Code als Ausgabe zu haben.
Was ja auch nicht immer uninteressant ist.
 
Zurück