var text = 'test [b]blah\n\ [i]tata[/i] blah[/b] param [quote="test"]d[quote="test2"]lalsd[li]fnsdf[alalsdfsda[/quote] qweqweqwe [u]ter[u]t[/quote]et[/u]er[/u] hjf [u]sdhg[/u] end';
var chang = '¬'; //Строка замены для "["
var re = /(\[([a-z]+)(?:="?([^\]]+?))?"?\])([^\[]*)(\[\/\2\])/gi,
next = true, step = 1;
while( next ) {
next = false;
if(step==1)text = text.replace( re, function( all, tagattr, tag, attr, content, close ) {
next = true;
//alert( [step,tagattr, tag, attr, content, close] );
return '<' + tag + '>' + content + '</' + tag + '>';
});
if ( !next) {step = 2;
text = text.replace(/^([\s\S]*?)(\[\/([a-z]+)\])([\s\S]*)$/i, function(str,strST,tagEnd, tag, strEnd) {
next = true;
var end = strST.length,
st = strST.lastIndexOf('['+tag);
if(st<0) return strST + chang+'/'+ tag + ']' + strEnd;
var find = text.substring(st,end),
rega = '^\\['+tag+'(?:="?([^\\[\\]]+?))?"?\\]([\\s\\S]*)$';
var found = find.replace(RegExp(rega,'i'), function(str,attr,content) {return '<'+tag+'>'+ content.replace(/\[/g, chang) + '</'+tag+'>'});
return text.substr(0,st) + (found!=find ? found : chang + find.slice(1)+ tagEnd) + strEnd;
})
}
}
text = text.replace(RegExp(chang,'g'),'['); //возвращаем скобку;
alert( text );
Чуть ускорил, сделав первый проход глобальным поиском (/gi),
На Втором проверка неполных вложенных тегов (Исключаем ситуации типа [div][li][/div][/li]; подменяем у них символ \[)
===================
В принципе вторая часть работает и самостоятельно, но совместно с первой, получаем приличное ускорение на тегах без квадратных скобок внутри