BBCode 标签的正则表达式 javascript

RegExp for BBCode tags javascript

我有这个正则表达式,但我不知道它有什么问题

tag = new RegExp('(\['+tag+'=("|'|)(.*?)\])((?:.|\r?\n)*?)\[/'+tag+']','g');

bbcode 标签可以有双引号、单引号或无引号。

[tag="teste"]123[/tag]
[tag='teste']123[/tag]
[tag=teste]123[/tag]

捕获中的所需输出:teste123

要匹配可选的引号,应该是("|'|)(["|\']*)("|\'?)?

字符串有什么问题

首先,让我们更正字符串中的语法

  • 你需要定义变量tag

    tag = 'tag';
    result = new RegExp( <...>  );
    
  • 您在 '("|'|) <...> ' 中有不平衡的引号,需要将其转义为 ("|\'|)

  • 此外,将 </code> 转义为 <code>\1

所以现在我们的表达式 '(\['+tag+'=("|\'|)(.*?)\1\])((?:.|\r?\n)*?)\[/'+tag+']' 的值为:

(\[tag=("|'|)(.*?)\])((?:.|\r?\n)*?)\[/tag]

正则表达式有什么问题

实际上只有一件事,在 ("|\'|)(.*?)\1 中,您使用 </code> 来匹配与用作开头的引号相同的引号。但是,1指的是第一个捕获组(从左到右第一个括号),而<code>("|'|)实际上是第二组括号,即第二组。您需要做的就是将其更改为 </code>.</p> <pre><code>(\[tag=("|'|)(.*?)\])((?:.|\r?\n)*?)\[/tag]

就是这样!

让我们添加一些最后的建议

  • 而不是 .*? 我会使用 [^\]]+ (除“]”之外的任何字符)
  • 使用i修饰符(不区分大小写的匹配,对于“[tag]...[/TaG]”)
  • ("|'|) 等同于 ("|'?)
  • 而不是 (?:.|\r?\n)*? 我会使用 [\s\S]*? 作为@nhahtdh 建议

代码:

tag = 'tag';
result = new RegExp('(\['+tag+'=("|\'?)([^\]]+)\2\])([\s\S]*?)\[/'+tag+']','gi');

备选方案: [编辑:来自评论中添加的信息]

result = new RegExp('\['+tag+'(?:=("|\'?)([^\]]+)\1)?\]([\s\S]*?)\[/'+tag+']', 'gi');

关于你的第二个问题:虽然 (["|\']*)("|\'?) 都会匹配,但后者是你要匹配的正确方法。 * 查找 0 到无限重复,| 被解释为字符 class 中的文字。相反,("|\'?) 匹配单引号、双引号或 none.