Вот самый лучший и качественный вариант, работает без ошибок и начинает действовать с середину, то-есть с вложенных а уж потом обрабатывает родительские теги.
var text = 'test [b=color]bold[/b] tatata [b]blah[/b] tata [code run]function(){}[/code] tar [quote]blah blah [i]ta[i]r[/i]am[/i] param[/quote]';
function parseBBCode( text ) {
return text.replace( /\[(([a-z]+)(?:(?:\=|\s)([^\]]+))?)\](.*)/gi, function( all, tagAttr, tag, attr, end ) {
var re = new RegExp( "(.*?)(\\[\\/(" + tag + ")\\]|\\[([a-z]+.*?)\\])(.*)", "i" );
return parseBBCode( end.replace( re, function( subAll, content, tags, closeTag, openTag, subEnd ) {
if ( openTag ) {
return '[' + tagAttr + ']' + parseBBCode( subAll );
} else {
// tag - содержит имя тега BBCode
// tagAttr - содержит и тег и его атрибут(ы)
// attr - трибут(ы) текущего тега
// content - собственно содержимое этого тега
alert( [ tagAttr, content, closeTag ].join("\n") );
return '<' + tag + '>' + content + '</' + closeTag + '>' + subEnd;
}
}));
});
}
alert( parseBBCode( text ) );