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

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]; подменяем у них символ \[)
===================
В принципе вторая часть работает и самостоятельно, но совместно с первой, получаем приличное ускорение на тегах без квадратных скобок внутри

Последний раз редактировалось Deff, 09.01.2016 в 07:25.
Ответить с цитированием