Яростный Меч,
Тест: (тег
[quote="test2"] - валидный - пропущен, по идее валидный и первый, но тут можно оспорить, ты сделал валидными теги [u]
var parseBB = function(str) {
if (!str) { return str; }
var rx = /\[(\/?)(b|i|u|s)\s*\]/gi;
var stack = [];
str = str.replace(rx, function(m, close, tag) {
tag = tag.toLowerCase();
if (close) {
if (!stack.length || (stack[stack.length - 1] !== tag)) {
return m;
}
stack.pop();
} else {
stack.push(tag);
}
return "<" + close + tag + ">";
});
if (stack.length) {
str = str + stack.reverse().map(function(tag) {
return "</" + tag + ">";
}).join("");
}
return str;
};
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';
alert(parseBB(text));
//Убрал атрибуты, сменил quote на s //Да, тут терпимо, но: у [/s] - концовка осталась (ошибки в закрывашках критичны - цитата - тег <div> убила бы страницу)
var text2 = 'test [b]blah\n\ [i]tata[/i] blah[/b] param [s]d[s]lalsd[li]fnsdf[alalsdfsda[/s] qweqweqwe [u]ter[u]t[/s]et[/u]er[/u] hjf [u]sdhg[/u] end';
alert(parseBB(text2))
Вдобавок у меня, при парсе на лету, когда юзер не закончил строку, желателен максимальный распарс тегов
//Тут ксать у мну и таблицы еще есть, пока не додумал как парсить исключения-ошибки отсутствия некоторых тегов)