Найдите пары BB-кодов
BB-код имеет вид [tag]...[/tag], где tag– это один из: b, url или quote.
Например:
[b]текст[/b]
[url]http://ya.ru[/url]BB-коды могут быть вложенными. Но сам в себя тег не может быть вложен, например:
Возможно:
[url] [b]http://ya.ru[/b] [/url]
[quote] [b]текст[/b] [/quote]
Не может быть:
[b][b]текст[/b][/b]Теги могут содержать переносы строк, это допустимо:
[quote]
  [b]текст[/b]
[/quote]Создайте регулярное выражение для поиска всех BB-кодов и их содержимого.
Например:
let regexp = /ваше регулярное выражение/флаги;
let str = "..[url]http://ya.ru[/url]..";
alert( str.match(regexp) ); // [url]http://ya.ru[/url]Если теги вложены, то нужно искать самый внешний тег (при желании можно продолжить поиск в его содержимом):
let regexp = /ваше регулярное выражение/флаги;
let str = "..[url][b]http://ya.ru[/b][/url]..";
alert( str.match(regexp) ); // [url][b]http://ya.ru[/b][/url]Открывающий тег – это \[(b|url|quote)].
Затем, чтобы найти всё до закрывающего тега – используем выражение .*? с флагом s: оно найдёт любые символы, включая новую строку, и затем добавим обратную ссылку на открывающий тег.
Полное выражение: \[(b|url|quote)\].*?\[/\1].
В действии:
let regexp = /\[(b|url|quote)].*?\[\/\1]/gs;
let str = `
  [b]привет![/b]
  [quote]
    [url]http://ya.ru[/url]
  [/quote]
`;
alert( str.match(regexp) ); // [b]привет![/b],[quote][url]http://ya.ru[/url][/quote]Обратите внимание, что кроме экранирования [ нам необходимо экранировать слеш в закрывающем теге [\/\1], потому что обычно слеш завершает паттерн.