Мы хотим сделать этот проект с открытым исходным кодом доступным для людей во всем мире. Пожалуйста, помогите нам перевести это руководство на другие языки.
вернуться к уроку

Найдите пары 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], потому что обычно слеш завершает паттерн.