回到课程

查找 bbtag 对

“bb-tag” 形如 [tag]...[/tag]tag 匹配 burlquote 中之一。

例如:

[b]text[/b]
[url]http://google.com[/url]

BB-tags 可以嵌套。但标签不能自嵌套,比如:

可以:
[url] [b]http://google.com[/b] [/url]
[quote] [b]text[/b] [/quote]

不可以:
[b][b]text[/b][/b]

标签可以包含换行,通常:

[quote]
  [b]text[/b]
[/quote]

构造一个正则表达式用于查找所有 BB-tags 及其内容。

例如:

let regexp = /your regexp/flags;

let str = "..[url]http://google.com[/url]..";
alert( str.match(regexp) ); // [url]http://google.com[/url]

如果标签嵌套,那么我们需要记录匹配的外层标签(如果需要,我们可以继续在其内容中搜索):

let regexp = /你的正则表达式/flags;

let str = "..[url][b]http://google.com[/b][/url]..";
alert( str.match(regexp) ); // [url][b]http://google.com[/b][/url]

起始标签是 \[(b|url|quote)\]

匹配字符串直到遇到结束标签 —— 让我们使用模式 .*? 和修饰符 s 来匹配包括换行符在内的任何字符,然后向结束标签添加反向引用。

完整模式为:\[(b|url|quote)\].*?\[/\1]

代码运行如下:

let regexp = /\[(b|url|quote)].*?\[\/\1]/gs;

let str = `
  [b]hello![/b]
  [quote]
    [url]http://google.com[/url]
  [/quote]
`;

alert( str.match(regexp) ); // [b]hello![/b],[quote][url]http://google.com[/url][/quote]

请注意,除了转义 [ 之外,我们还必须为结束标签 [\/\1] 转义一个斜线,因为通常斜线会关闭模式。