Причина, по которой вложенный блок не заменяется, состоит в том, что совпадение для [b] ставит позицию после [/ b]. Таким образом, все, что соответствует ((.) {1,}?), Игнорируется.
Можно написать рекурсивный парсер на стороне сервера - Perl использует qr // , а в Ruby, вероятно, есть что-то похожее.
Хотя вам не обязательно нужен настоящий рекурсив. Вы можете использовать относительно простой цикл для эквивалентной обработки строки:
var s = '[b]hello[/b] [u]world[/u] [b]foo [u]to the[/u] bar[/b]';
var exptags = /\[(b|u|i|s|center|code){1}]((.){1,}?)\[\/(\1){1}]/ig;
while (s.match(exptags)) {
s = s.replace(exptags, "<$1>$2</$1>");
}
document.writeln('<div>' + s + '</div>'); // after
В этом случае он сделает 2 прохода:
0: [b]hello[/b] [u]world[/u] [b]foo [u]to the[/u] bar[/b]
1: <b>hello</b> <u>world</u> <b>foo [u]to the[/u] bar</b>
2: <b>hello</b> <u>world</u> <b>foo <u>to the</u> bar</b>
Также, несколько советов по очистке RegEx:
var exptags = /\[(b|u|i|s|center|code)\](.+?)\[\/(\1)\]/ig;
- {1} предполагается, когда не существует других спецификаторов подсчета
- {1,} можно сократить до +