BBCode的JavaScript RegExp帮助

BBCode的JavaScript RegExp帮助,javascript,regex,Javascript,Regex,我有几个星期前找到的这个RegExp表达式 /([\r\n])|(?:\[([a-z\*]{1,16})(?:=([^\x00-\x1F"'\(\)<>\[\]]{1,256}))?\])|(?:\[\/([a-z]{1,16})\])/ig /([\r\n])|(?:\[([a-z\*]{1,16})(?:=([^\x00-\x1F'\(\)\[\]{1256}))?\])|(?:\[\/([a-z]{1,16})/ig 它正在努力寻找BBCode标签,比如[url]和[cod

我有几个星期前找到的这个RegExp表达式

/([\r\n])|(?:\[([a-z\*]{1,16})(?:=([^\x00-\x1F"'\(\)<>\[\]]{1,256}))?\])|(?:\[\/([a-z]{1,16})\])/ig
/([\r\n])|(?:\[([a-z\*]{1,16})(?:=([^\x00-\x1F'\(\)\[\]{1256}))?\])|(?:\[\/([a-z]{1,16})/ig
它正在努力寻找BBCode标签,比如
[url]
[code]

但是如果我尝试
[url=”http://www.google.com“]
它不匹配。我不太擅长RegExp,我不知道如何仍然有效,但
=”http://www.google.com“
可以是可选的


这对于
[color=“red”]
也是失败的,但这与url标记的问题是相同的。

这部分:
[^\x00-\x1F”\(\)\[\]
表示在
=
之后不能有“。这意味着您的regexp与
[url]匹配=http://stackoverflow.com]
。如果您想要引用,只需将它们放在您的捕获组周围即可:

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

我认为,显式枚举所有要匹配的标记会让您受益匪浅,因为它应该允许更具体地匹配结束标记

这里有一个:

您可能会注意到,正则表达式由一组较小的标记组成,每个标记表示一个具有可变长度的可能属性(
(?:=“[^”]*”)
,请参见下面的说明),如
[url=“google.com”]
,并用交替运算符
|
分隔


(=“[^”]*”)
表示一个
=
符号,然后是一个双引号,后面是任何数量的双引号(
[^”]
)以外的任何符号,即0或更多(
*
)最后的
意味着整个团队可能根本不存在。

有效,但现在没有选项就不起作用了……比如[url]不/([\r\n])|(?:[([a-z*]{1,16})(?:=([^\x00-\x1F'()[]{1256}]))|(?:[\/([a-z]{1,16})]/i将第二个“错误”放在了后面。现在它应该可以工作并匹配[url]、[url=“sfdgs”]和[/url]
var tags = [ 'url', 'code', 'b' ]; // add more tags

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

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