WAY2WEB: Web Design & business...


BBcode2HTML: easily parse BBcode

BBcode is a spinoff of HTML, which is generally used on bulliten boards and online forums. It is a easy way to allow users to styalise their posts, without empowering them too much.

It has a unique syntax, which involves wrapping certain letters in square brackets. Wikipedia explains the syntax very nicely. Of course, there is no written standard which every implementation uses, so everything is very ad-hoc.

Understanding how to translate BBcode into a browser readable language can be difficult. You need a tricky mixture of PHP and Regex to accomplish this task.

I have written my own PHP based translation method, which supports some of the most common tags. There are many restrictions, but this is perfect if you want the basics. Take a look at the code:

<style type="text/css">
<!--
body  {
   font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 12px;
}

.bold {
   font-weight: bold;
}

.italics {
   font-style: italic;
}

.underline {
   text-decoration: underline;
}

.strikethrough {
   text-decoration: line-through;
}

.overline {
   text-decoration: overline;
}

.sized {
   text-size:
}

.quotecodeheader {
   font-family: Verdana, arial, helvetica, sans-serif;
   font-size: 12px;
   font-weight: bold;
}

.codebody {
   background-color: #FFFFFF;
    font-family: Courier new, courier, mono;
    font-size: 12px;
    color: #006600;
    border: 1px solid #BFBFBF;
}

.quotebody {
   background-color: #FFFFFF;
    font-family: Courier new, courier, mono;
    font-size: 12px;
    color: #660002;
   border: 1px solid #BFBFBF;
}

.listbullet {
   list-style-type: disc;
   list-style-position: inside;
}

.listdecimal {
   list-style-type: decimal;
   list-style-position: inside;
}

.listlowerroman {
   list-style-type: lower-roman;
   list-style-position: inside;
}

.listupperroman {
   list-style-type: upper-roman;
   list-style-position: inside;
}

.listloweralpha {
   list-style-type: lower-alpha;
   list-style-position: inside;
}

.listupperalpha {
   list-style-type: upper-alpha;
   list-style-position: inside;
}
-->
</style>

<?php
   
//BBcode 2 HTML was written by WAY2WEB.net

   
function BBCode($Text)
       {
         
// Replace any html brackets with HTML Entities to prevent executing HTML or script
            // Don't use strip_tags here because it breaks [url] search by replacing & with amp
            
$Text str_replace("<""&lt;"$Text);
            
$Text str_replace(">""&gt;"$Text);

            
// Convert new line chars to html <br /> tags
            
$Text nl2br($Text);

            
// Set up the parameters for a URL search string
            
$URLSearchString " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
            
// Set up the parameters for a MAIL search string
            
$MAILSearchString $URLSearchString " a-zA-Z0-9\.@";

            
// Perform URL Search
            
$Text preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/"'<a href="$1" target="_blank">$1</a>'$Text);
            
$Text preg_replace("(\[url\=([$URLSearchString]*)\](.+?)\[/url\])"'<a href="$1" target="_blank">$2</a>'$Text);
         
//$Text = preg_replace("(\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[/url\])", '<a href="$1" target="_blank">$2</a>', $Text);

            // Perform MAIL Search
            
$Text preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])"'<a href="mailto:$1">$1</a>'$Text);
            
$Text preg_replace("/\[mail\=([$MAILSearchString]*)\](.+?)\[\/mail\]/"'<a href="mailto:$1">$2</a>'$Text);
         
            
// Check for bold text
            
$Text preg_replace("(\[b\](.+?)\[\/b])is",'<span class="bold">$1</span>',$Text);

            
// Check for Italics text
            
$Text preg_replace("(\[i\](.+?)\[\/i\])is",'<span class="italics">$1</span>',$Text);

            
// Check for Underline text
            
$Text preg_replace("(\[u\](.+?)\[\/u\])is",'<span class="underline">$1</span>',$Text);

            
// Check for strike-through text
            
$Text preg_replace("(\[s\](.+?)\[\/s\])is",'<span class="strikethrough">$1</span>',$Text);

            
// Check for over-line text
            
$Text preg_replace("(\[o\](.+?)\[\/o\])is",'<span class="overline">$1</span>',$Text);

            
// Check for colored text
            
$Text preg_replace("(\[color=(.+?)\](.+?)\[\/color\])is","<span style=\"color: $1\">$2</span>",$Text);

            
// Check for sized text
            
$Text preg_replace("(\[size=(.+?)\](.+?)\[\/size\])is","<span style=\"font-size: $1px\">$2</span>",$Text);

            
// Check for list text
            
$Text preg_replace("/\[list\](.+?)\[\/list\]/is"'<ul class="listbullet">$1</ul>' ,$Text);
            
$Text preg_replace("/\[list=1\](.+?)\[\/list\]/is"'<ul class="listdecimal">$1</ul>' ,$Text);
            
$Text preg_replace("/\[list=i\](.+?)\[\/list\]/s"'<ul class="listlowerroman">$1</ul>' ,$Text);
            
$Text preg_replace("/\[list=I\](.+?)\[\/list\]/s"'<ul class="listupperroman">$1</ul>' ,$Text);
            
$Text preg_replace("/\[list=a\](.+?)\[\/list\]/s"'<ul class="listloweralpha">$1</ul>' ,$Text);
            
$Text preg_replace("/\[list=A\](.+?)\[\/list\]/s"'<ul class="listupperalpha">$1</ul>' ,$Text);
            
$Text str_replace("[*]""<li>"$Text);

            
// Check for font change text
            
$Text preg_replace("(\[font=(.+?)\](.+?)\[\/font\])","<span style=\"font-family: $1;\">$2</span>",$Text);

            
// Declare the format for [code] layout
            
$CodeLayout '<table width="90%" border="0" align="center" cellpadding="0" cellspacing="0">
                                <tr>
                                    <td class="quotecodeheader"> Code:</td>
                                </tr>
                                <tr>
                                    <td class="codebody">$1</td>
                                </tr>
                           </table>'
;
            
// Check for [code] text
            
$Text preg_replace("/\[code\](.+?)\[\/code\]/is","$CodeLayout"$Text);
            
// Declare the format for [php] layout
            
$phpLayout '<table width="90%" border="0" align="center" cellpadding="0" cellspacing="0">
                                <tr>
                                    <td class="quotecodeheader"> Code:</td>
                                </tr>
                                <tr>
                                    <td class="codebody">$1</td>
                                </tr>
                           </table>'
;
            
// Check for [php] text
            
$Text preg_replace("/\[php\](.+?)\[\/php\]/is",$phpLayout$Text);

            
// Declare the format for [quote] layout
            
$QuoteLayout '<table width="90%" border="0" align="center" cellpadding="0" cellspacing="0">
                                <tr>
                                    <td class="quotecodeheader"> Quote:</td>
                                </tr>
                                <tr>
                                    <td class="quotebody">$1</td>
                                </tr>
                           </table>'
;
                     
            
// Check for [quote] text
            
$Text preg_replace("/\[quote\](.+?)\[\/quote\]/is","$QuoteLayout"$Text);
         
            
// Images
            // [img]pathtoimage[/img]
            
$Text preg_replace("/\[img\](.+?)\[\/img\]/"'<img src="$1">'$Text);
         
            
// [img=widthxheight]image source[/img]
            
$Text preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.+?)\[\/img\]/"'<img src="$3" height="$2" width="$1">'$Text);
         
           return 
$Text;
      }
$text '[code]<?php
$instring = "hello world!";
echo $instring;
?>[/code]'
;
$text BBCode($text);
echo 
$text;
?>

While it should be noted that there are a few security risks which are posed if using this code off the shelf, it does serve a great starting point for creating a BBcode based website. Please use this wherever you have a need - I don't ask for much in return. A link back would be nice, but I don't force this restriction upon you.