JavaScript正则表达式教程 - BBCode用法

3

我有这个正则表达式,几周前找到的

/([\r\n])|(?:\[([a-z\*]{1,16})(?:=([^\x00-\x1F"'\(\)<>\[\]]{1,256}))?\])|(?:\[\/([a-z]{1,16})\])/ig

现在它已经可以识别BBCode标签,例如[url][code]

但是,如果我尝试使用[url="http://www.google.com"],它将无法匹配。我不太擅长正则表达式,也无法弄清楚如何使其仍然有效,但="http://www.google.com"是可选的。

这对于[color="red"]也失败了,但我认为这与url标签遇到的问题相同。

2个回答

1
这部分代码:[^\x00-\x1F"'\(\)<>\[\]] 表示在 = 之后不能有一个 "。这意味着你的正则表达式匹配了 [url=http://stackoverflow.com]。如果你想要引号,你可以简单地将它们放在捕获组周围:

/([\r\n])|(?:\[([a-z\*]{1,16})(?:="([^\x00-\x1F"'\(\)<>\[\]]{1,256})")?\])|(?:\[\/([a-z]{1,16})\])/gi

那个可行但现在不带选项就不行了... 就像[url]不行 - Mitchell Simoens
/([\r\n])|(?:[([a-z*]{1,16})(?:=([^\x00-\x1F'()<>[]]{1,256}))?])|(?:[/([a-z]{1,16})])/ig - Mitchell Simoens
将第二个引号放错了位置。现在应该可以正常工作并匹配 [url],[url="sfdgs"] 和 [/url]。 - topek

1

我认为你会受益于明确列举出你想匹配的所有标签,因为这样可以更具体地匹配闭合标签。

这里是一个示例代码

var tags = [ 'url', 'code', 'b' ]; // add more tags

var regParts = tags.map(function (tag) {
    return '(\\[' + tag + '(?:="[^"]*")?\\](?=.*?\\[\\/' + tag + '\\]))';
});

var re = new RegExp(regParts.join('|'), 'g');

你可能会注意到,正则表达式由一组较小的表达式组成,每个表达式代表一个带有可能属性((?:="[^"]*")?,请参见下面的解释)的单个标签,如[url="google.com"],并用交替运算符|分隔。

(="[^"]*")?表示一个=符号,然后是双引号,后跟除双引号之外的任何符号([^"]),数量不定,即0或更多次(*),最后是一个闭合引号。最后的?表示整个组可能根本不存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接