Page 1 of 1
Writing a template parser for BB Code
Posted: Thu Nov 27, 2003 12:44 pm
by Jim
I just can't seem to figure out template parsing. How do forums like this change
Code: Select all
їurl=http://site.com]Site dot Comї/url]
In to a working link for site.com? I can't find tuts for this anywhere!
just copy it from existing open source bb board :)
Posted: Thu Nov 27, 2003 1:29 pm
by ghost007
Code: Select all
<?php
/**
* bbdecode/bbencode functions:
* Rewritten - Nathan Codding - Aug 24, 2000
* quote, code, and list rewritten again in Jan. 2001.
* All BBCode tags now implemented. Nesting and multiple occurances should be
* handled fine for all of them. Using str_replace() instead of regexps often
* for efficiency. quote, list, and code are not regular, so they are
* implemented as PDAs - probably not all that efficient, but that's the way it is.
*
* Note: all BBCode tags are case-insensitive.
*/
function bbencode($message, $is_html_disabled) {
// pad it with a space so we can distinguish between FALSE and matching the 1st char (index 0).
// This is important; bbencode_quote(), bbencode_list(), and bbencode_code() all depend on it.
$message = " " . $message;
// First: If there isn't a "[" and a "]" in the message, don't bother.
if (! (strpos($message, "[") && strpos($message, "]")) )
{
// Remove padding, return.
$message = substr($message, 1);
return $message;
}
//
for posting code (HTML, PHP, C etc etc) in your posts.
$message = bbencode_code($message, $is_html_disabled);
//
and
for posting replies with quote, or just for quoting stuff.
$message = bbencode_quote($message);
//
- and
- for (un)ordered lists.
$message = bbencode_list($message);
// and for bolding text.
$message = preg_replace("/\[b\](.*?)\[\/b\]/si", "<!-- BBCode Start --><B>\\1</B><!-- BBCode End -->", $message);
// and for italicizing text.
$message = preg_replace("/\[i\](.*?)\[\/i\]/si", "<!-- BBCode Start --><I>\\1</I><!-- BBCode End -->", $message);
// [SIZE= X] and [/SIZE] for small text.
$message = preg_replace("/\[SIZE={1}(.*?)\](.*?)\[\/SIZE\]/si", "<!-- BBCode Start --><font size="\\1">\\2</font><!-- BBCode End -->", $message);
// [font= X] and [/font] for small text.
$message = preg_replace("/\[FONT={1}(.*?)\](.*?)\[\/FONT\]/si", "<!-- BBCode Start --><font face="\\1">\\2</font><!-- BBCode End -->", $message);
// [color= X] and [/font] for small text.
$message = preg_replace("/\[COLOR={1}(.*?)\](.*?)\[\/COLOR\]/si", "<!-- BBCode Start --><font color="\\1">\\2</font><!-- BBCode End -->", $message);
// [img]image_url_here[/img] code..
$message = preg_replace("/\[img\](.*?)\[\/img\]/si", "<!-- BBCode Start --><div align="center"><IMG SRC="\\1" BORDER="0"></div><!-- BBCode End -->", $message);
// Patterns and replacements for URL and email tags..
$patterns = array();
$replacements = array();
// [url]xxxx://www.phpbb.com[/url] code..
$patterns[0] = "#\[url\]([a-z]+?://){1}(.*?)\[/url\]#si";
$replacements[0] = '<!-- BBCode u1 Start --><A HREF="\1\2" TARGET="_blank">\1\2</A><!-- BBCode u1 End -->';
// http://www.phpbb.com code.. (no xxxx:// prefix).
$patterns[1] = "#\[url\](.*?)\[/url\]#si";
$replacements[1] = '<!-- BBCode u1 Start --><A HREF="http://\1" TARGET="_blank">\1</A><!-- BBCode u1 End -->';
// [url=xxxx://www.phpbb.com]phpBB[/url] code..
$patterns[2] = "#\+?://){1}(.*?)\](.*?)\[/url\]#si";
$replacements[2] = '<!-- BBCode u2 Start --><A HREF="\1\2" TARGET="_blank">\3</A><!-- BBCode u2 End -->';
// [url=http://www.phpbb.com]phpBB code.. (no xxxx:// prefix).
$patterns[3] = "#\(.*?)\[/url\]#si";
$replacements[3] = '<!-- BBCode u2 Start --><A HREF="http://\1" TARGET="_blank">\2</A><!-- BBCode u2 End -->';
// [email]user@domain.tld[/email] code..
$patterns[4] = "#\[email=\](.*?)\[/email\]#si";
$replacements[4] = '<!-- BBCode Start --><A HREF="mailto:\1">\1</A><!-- BBCode End -->';
// [email=user@domain.tld]Text[/email] code..
$patterns[5] = "#\[email={1}(.*?)\](.*?)\[/email\]#si";
$replacements[5] = '<!-- BBCode Start --><A HREF="mailto:\1">\2</A><!-- BBCode End -->';
$message = preg_replace($patterns, $replacements, $message);
// Remove our padding from the string..
$message = substr($message, 1);
return $message;
} // bbencode()
function bbdecode($message) {
// Undo Code: Select all
$code_start_html = "<!-- BBCode Start --><TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD><font size=-1>Code:</font><HR></TD></TR><TR><TD><FONT SIZE=-1><PRE>";
$code_end_html = "</PRE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE><!-- BBCode End -->";
$message = str_replace($code_start_html, "[code]", $message);
$message = str_replace($code_end_html, "
", $message);
// Undo
$quote_start_html = "<!-- BBCode Quote Start --><TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD><font size=-1>Quote:</font><HR></TD></TR><TR><TD><FONT SIZE=-1><BLOCKQUOTE>";
$quote_end_html = "</BLOCKQUOTE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE><!-- BBCode Quote End -->";
$message = str_replace($quote_start_html, "
", $message);
$message = str_replace($quote_end_html, "
", $message);
// Undo and
$message = preg_replace("#<!-- BBCode Start --><B>(.*?)</B><!-- BBCode End -->#s", "\\1", $message);
$message = preg_replace("#<!-- BBCode Start --><I>(.*?)</I><!-- BBCode End -->#s", "\\1", $message);
// undo [SIZE=n] and [/SIZE]
$message = preg_replace("#<!-- BBCode Start --><font size="{1}(.*?)">(.*?)</font><!-- BBCode End -->#s","[SIZE=\\1]\\2[/SIZE]", $message);
// undo [font= X] and [/font]
$message = preg_replace("#<!-- BBCode Start --><font face="{1}(.*?)">(.*?)</font><!-- BBCode End -->#s","[FONT=\\1]\\2[/FONT]", $message);
// undo [color= X] and [/font]
$message = preg_replace("#<!-- BBCode Start --><font color="{1}(.*?)">(.*?)</font><!-- BBCode End -->#s","[COLOR=\\1]\\2[/COLOR]", $message);
// Undo (long form)
$message = preg_replace( ... \\1\\2]\\3", $message);
// Undo (short form)
$message = preg_replace ... "[url]\\3", $message);
// Undo [email]
$message = preg_replace("#<!-- BBCode Start --><A HREF="mailto:(.*?)">(.*?)</A><!-- BBCode End -->#s", "[email]\\1[/email]", $message);
// Undo [img]
$message = preg_replace("#<!-- BBCode Start --><IMG SRC="(.*?)" BORDER="0"><!-- BBCode End -->#s", "[img]\\1[/img]", $message);
// Undo lists (unordered/ordered)
// <li> tags:
$message = str_replace("<!-- BBCode --><LI>", " - ", $message);
// - tags:
$message = str_replace("<!-- BBCode ulist Start --><UL>", "- ", $message);
// - tags:
$message = preg_replace("#<!-- BBCode olist Start --><OL TYPE=([A1])>#si", " tags:
$message = str_replace("</UL><!-- BBCode ulist End -->", "
", $message);
$message = str_replace("</OL><!-- BBCode olist End -->", "
", $message);
return($message);
}
?>
greets
siech
Posted: Thu Nov 27, 2003 5:52 pm
by McGruff
Or str_replace (preferred to regex, unless you really need to).
Posted: Thu Nov 27, 2003 7:22 pm
by m3mn0n
replace
with <a href= and then ] with > then with </a>
I used [php_man]eregi_replace[/php_man]() for my forum's BBcode. =)
Posted: Thu Nov 27, 2003 8:06 pm
by Joan Garnet
I'm just doing something like that

regular expressions are the key, but it's not that easy ...