RegExp for BBCode标签javascript

时间:2015-09-03 23:58:50

标签: javascript regex syntax

我有这个RegExp,我不知道它有什么问题

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

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

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

捕获中的所需输出:teste123

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

1 个答案:

答案 0 :(得分:1)

字符串错误

首先,让我们更正字符串

中的语法
  • 您需要定义var tag

    tag = 'tag';
    result = new RegExp( <...>  );
    
  • 您在'("|'|) <...> '中有不合时宜的引号,需要转发为("|\'|)

  • 另外,将\1转义为\\1

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

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

RegEx

有什么问题

只有一件事,("|\'|)(.*?)\\1您使用\1来匹配与用作开头的引号相同的引号。但是,1表示第一个捕获组(从左到右的第一个括号),但("|'|)实际上是第二组括号,第二组。您需要做的就是将其更改为\2

(\[tag=("|'|)(.*?)\2\])((?:.|\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到无限重复,|在字符类中被解释为文字。相反,("|\'?)匹配单引号,双引号或无引号。