да, что-то более лучшего ничего не выходит, только так:
var text = 'test [b]blah [i]tata[/i] blah[/b] param [quote="test"]lal[alala[/quote] qweqweqwe [u]ter[u]tet[/u]er[/u] hjf [u]sdhg[/u] end';
var re = /(\[\s*([a-z]+)\s*(?:=?\s*([^\]]+))?\])([^\[]+)(\[\/\2\])/i,
next = true, step = 1;
while( next ) {
next = false;
text = text.replace( re, function( all, tagattr, tag, attr, content, close ) {
next = true;
alert( [tagattr, tag, attr, content, close] );
return '<' + tag + '>' + content + '</' + tag + '>';
});
if ( !next && step++ == 1 ) {
next = true;
re = /(\[\s*([a-z]+)\s*(?:=?\s*([^\]]+))?\])(.*?)(\[\/\2\])/i;
}
}
alert( text );