Regex for BBCode in PHP

 Regular Expressions (Regex) are a way to parse information and match it with a larger string. For example, If you wanted to validate an email address, you could write a regular expression that would try to match the email address given to you with what you considered as "valid". If it matched, it's a valid email address, if it didn't, then it's not. But we aren't going to focus on Email and other validations right now, we are going to make BBCode!

For those of you that don't know, BBCode (or Bulletin Board Code as it was first used) is custom written HTML-style tags to format text without placing actual HTML code directly into the database or page.

For example: If you have a user post something on the comments section here, and they happen to slip some Javascript code into their comment, it might not end very well for anyone. So HTML tags are stripped for security purposes, but if that is the case, how will someone be able to bold or italizie their text? That is where BBCode comes in.

I am going to be using the preg_replace function in this hub, but you could use a variety of other functions (such as ereg_* or eregi_*). So let's define what tags we want to use.

So let's define some custom tags we want to do. I am just going to show you a few as any set of tags can more or less be derived from this set.

  • [b]Bold Text[/b]
  • [link=http://url.com]Text Link[/link]
  • [img]http://url.com/image.jpg[/img]
  • [quote=Person's Name]Person's Quote[/quote]

Let's start out with the very simple on of [b] and explain as we go what each part of the code means, then add to it for the other tags.

 

function.php

function parseCode($txt)
{
   // these functions will clean the code first
   $ret = strip_tags($txt);
   
   // code replacements
   $ret = preg_replace('#\[b\](.+)\[\/b\]#iUs', '<b>$1</b>', $ret);
   
   // return parsed string
   return $ret;
}

 First, as you see in the parse function, i stripped out the HTML tags BEFORE running this code. If i replace the BBCode into HTML code then strip the tags, then i will have stripped out what i just replaced and that will defeat the purpose.

Second, in the replace function, the first parameter is the matching string. let's take a look at this in more detail.

  • #\[b\](.+)\[\/b\]#iUs

The first thing that you will need are delimeters. I chose to use #'s for mine, however other symbols such as  / will work. This is a personal preference as this could could have looked like:

  • /\[b\](.+)\[\/b\]/iUs

The delimeter means to match all the code within those bounds, as we put some parameters after. The next bit of code you might notice is all the \'s. This is the escape character in PHP, that means, ignore the next character to follow and don't treat it as a special symbol. [b] and \[b\] mean two separate things. The first means match a B only, the second means to match [B].

The (.+) is the text that you want to make bold. the ( )'s mean that there is a set of text that you want to match and save to a variable. In this case, trasfer into the HTML tags. the . means "any character", and the + means "one or more". Here is a quick list of regex symbols

  • .  -- any character
  • + -- one or more times
  • * -- zero or more times
  • ? -- zero or one time only
  • [a-z] -- any letter lowercase
  • [A-Z] -- any letter uppercase
  • [0-9] -- any digit
  • | -- or (i.e.  (http|https|ftp) for a URL match

So we say any character, 1 or more times are going to be matched. The content in this box as you can probably get is going to be replaced by the $1 in the next parameter. The numbers correspond to the order of the ()'s in your code. I wil show and example of multiple $'s in a minute.

Finally we have the parameters at the end, i will explain these three but there are more of them out there

  • i -- case incensitive, so both [b] and [B] will match
  • s -- multiple lines will match
  • U -- unique.

the U is important in these as without it you will get the following: [b]Hello[/b] there [b]World[/b] will be replaced with <b>Hello[/b] there [b]World</b>. And we don't want that!

So now we have done our simply replace of the [b] BBCode, let's do the others

function.php

function parseCode($txt)
{
   // these functions will clean the code first
   $ret = strip_tags($txt);
   
   // code replacements
   $ret = preg_replace('#\[b\](.+)\[\/b\]#iUs', '<b>$1</b>', $ret);
   $ret = preg_replace('#\[link\=(.+)\](.+)\[\/link\]#iUs', '<a href="$1">$2</a>', $ret);
   $ret = preg_replace('#\[img\](.+)\[\/img\]#iUs', '<img src="$1" alt="Image" />', $ret); 
   $ret = preg_replace('#\[quote\=(.+)\](.+)\[\/quote]#iUs', '<div class="quote">$2</div><div class="quote-by">By: $1</div>', $ret);

   
   // return parsed string
   return $ret;
}

 Armed with this, you should be able to make all sorts of custom tags for your forum, blog, or website. Best of luck and enjoy!

Comments 5 comments

tirial 5 years ago

Thanks for the very useful guide! It helped me solve a tricky problem that had had me stuck this morning.


Nike Air Max Shoes 4 years ago

Welcome! Nike Air Max Shoes Pas Cher .FR,Store Online, "Health & Lifestyle" . Sale All kinds of Nike Air Max shoes, with nike air max 90, nike air max 95,nike air max 2012,nike air max 2011,nike air max pas cher etc. www.nikeairmaxot.com.


Monsoon 4 years ago

Thank you very much, this was very helpful.


Bien 4 years ago

I'm working on a new WebCodeStandart, the PUR Standart.

Just take a look at: http: //casio.bplaced.de/forum/webing/105/

English Translation is avilable. Right top.

Bien.


Johna387 2 years ago

Link exchange is nothing else but it is simply placing the other persons web site link on your page at proper place and other person will also do same for you. bfgckfafffeb

    Sign in or sign up and post using a HubPages Network account.

    0 of 8192 characters used
    Post Comment

    No HTML is allowed in comments, but URLs will be hyperlinked. Comments are not for promoting your articles or other sites.


    Click to Rate This Article
    working