Malte: Problem mit BBcodes

Hi

ich habe ein kleines Problem mit meiner BBCode Funktion.
Es klappt alles wenn man nur einen macht: [ b] jasdkj[/ b].
Aber wenn es verschachtelt ist [ i]bdykjf [ b] jasdkj[/ b]. [/ i]
dann geht es nicht.

function bbcode ($bbcode)  
{  
$bbcode = addslashes(htmlspecialchars(stripslashes ($bbcode)));  
$bbcode=preg_replace("/\[b\](.*?)\[\/b\]/si", "<b>\\1</b>", $bbcode);  
$bbcode=preg_replace("/\[i\](.*?)\[\/i\]/si", "<i>\\1</i>", $bbcode);  
$bbcode=preg_replace("/\[s\](.*?)\[\/s\]/si", "<s>\\1</s>", $bbcode);  
$bbcode=preg_replace("/\[u\](.*?)\[\/u\]/si", "<u>\\1</u>", $bbcode);  
$bbcode=preg_replace("/\[center\](.*?)\[\/center\]/si", "<center>\\1</center>", $bbcode);  
$bbcode=preg_replace("/\[url\](.*?)\[\/url\]/si", "<a href=\\1>\\1</a>", $bbcode);  
$bbcode=preg_replace("/\[code\](.*?)\[\/code\]/si", '<center>CODE:<div style="text-align:left;border:1px solid black;font-size:12px;color:green;background-color:#ececec;width:500px;padding:5px;">\\1</div></center>', $bbcode);  
$bbcode=preg_replace("/\[img\](.*?)\[\/img\]/si", '<img src=\\1 border="0">', $bbcode);  
  
$bbcode = nl2br ($bbcode);  
return $bbcode;  
  
}

Ich weiß aber nicht warum.
Könnt ihr mir helfen?

  1. Hi Malte,

    ich habe ein kleines Problem mit meiner BBCode Funktion.
    Es klappt alles wenn man nur einen macht: [ b] jasdkj[/ b].
    Aber wenn es verschachtelt ist [ i]bdykjf [ b] jasdkj[/ b]. [/ i]
    dann geht es nicht.
    ...
    Ich weiß aber nicht warum.

    Ich ehrlich gesagt, auch nicht. Zum Testen bin ich zu faul. Aber vielleicht liegt es an diesem Konstrukt: "(.*?)"?
    Das HTML, welches deine Funktion zurückgibt, ist auch nicht gerade vom Aktuellsten. <center> ist eigentlich schon lange
    veraltet. Außerdem würde ich Quellcodes nicht zentrieren.

    Könnt ihr mir helfen?

    Es lohnt sich nicht (meiner unbedeutenden Meinung nach), das Rad immer wieder neu zu erfinden. Gerade Scripts, die BBCodes in HTML umwandeln, gibt es mittlerweile wie Sand am Meer. Am einfachsten kopiert man daher das Original (vom phpBB), oder verwendet ein Script, dass schon seinen Funktionstest bestanden hat.

    Ein gutes Beispiel ist die BBCode-Parserklasse von Christion Seiler. Sie stellt auch die korrekte Verschachtelung der Tags sicher.

    Bist du mir böse, wenn ich dir einfach meine "BBCode"-Funktion hinwerfe? Die funktioniert bisher ganz gut. Sie enthält
    noch einige Zusatz-Features, die in normalen BBCodes nicht vorkommen. Die sind aber im Quelltext kommentiert. Inkorrekte Verschachtelungen werden damit aber gnadenlos übernommen.

      
      
    // Sorry, aber diese Konstante muss sein ... ;-)  
    // ... auch wenn sie nicht wirklich sinnvoll erscheint ...  
    define('EMPTY_STRING', '');  
      
    function foxy_bbcode(  
      $input = EMPTY_STRING  
    ) {  
      // einen leeren String brauchen wir nicht konvertieren  
      if($input === EMPTY_STRING) return(EMPTY_STRING);  
      $nl = "\n";  
      
      $replace = array(  
        // HTML-Codes entwerten, Achtung: &-Entwertung muss zuerst stehen!  
        '/&/'         => '&#38;',  
        '/</'         => '&#60;',  
        '/>/'         => '&#62;',  
      
        // fett, schraeg unterstrichen, HTML-Listen  
        '/\[(\/?)(b|i|u|li|ul|ol)\]/i'        => '<$1$2>',  
      
        // Zitatbloecke  
        '/\[(\/?)(quote)\]/i'        => '<$1blockquote>',  
      
        // Quellcodes und praeformatierter Text  
        '/\s*\[code\]\s*/i'          => '<pre style="border: 1px red solid;">',  
        '/\s*\[\/code\]\s*/i'        => '</pre>',  
      
        // horizontale Trennlinien  
        // Wie in MediaWiki  
        '/\s*\-{4,}\s+/' => '<hr />',  
      
        // Überschriften (MediaWiki-like)  
        '/^(={1,6})\s*(.+)\s*(\1)\s*$/me' => '\'<h\'.strlen(\'$1\').\'>\'.rtrim(\'$2\').\'</h\'.strlen(\'$1\').\'>\'',  
      
        // speziell formatierte URLs  
        // erweiterte Link-Codes, müssen vor dem Regexp mit http:// stehen:  
        // sprechende Links aehnlich wie im SelfHTML-Forum  
        '/\[url\]\s*(.+):(.+)\s*\@(title|name)=(.+)\s*\[\/url\]/i' => '<a href="$1&#58;$2">$4</a>',  
        '/\[url\]\s*(.+):(.+)\s*\[\/url\]/i' => '<a href="$1&#58;$2">$1&#58;$2</a>',  
      
        // Links im Text  
        // E-Mail-Adressen werden hier absichtlich nicht untertuetzt!  
        '/(http\:\/\/[^\s\>]+)(\s)/' => '<a href="$1">$1</a>$2',  
      
        // alle Regexp., die mit Whitespaces am Ende hantieren,  
        // muessen vor dieser Anweisung stehen:  
        '/\n/' => $nl.'<br />',  
      
      
        // Zuviel erzeugte br-Zeilenumbrüche in pre-Bereichen, Listen und anderen  
        // Tags, wo sie nicht hingehören, wieder entfernen  
        '/<br\ \/>(<\/?(ol|ul|li|xpre|blockquote|h[123456r]))/' => $nl.'$1',  // BR vor den Tags  
        '/(<\/(ol|ul|li|xpre|blockquote|h[123456r]))(\r\n|\n|\r)<br\ \/>/' => '$1'.$nl,  // BR nach den Tags  
      );  
      
      $keys = array_keys($replace);  
      $vals = array_values($replace);  
      
      return( preg_replace($keys, $replace, $input) );  
    }  
    
    

    Die Formatierung des ausgegebenen HTML-Quelltextes ist zwar nicht das Gelbe vom Ei, aber im Browser siehts ganz gut aus.

    MffG
    EisFuX

    --
    ... Suchmaschinen-Blog ...