Показать сообщение отдельно
  #48 (permalink)  
Старый 07.01.2016, 03:01
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Яростный Меч,
Тест: (тег [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))

Вдобавок у меня, при парсе на лету, когда юзер не закончил строку, желателен максимальный распарс тегов
//Тут ксать у мну и таблицы еще есть, пока не додумал как парсить исключения-ошибки отсутствия некоторых тегов)

Последний раз редактировалось Deff, 07.01.2016 в 04:23.
Ответить с цитированием