[英]RegExp for BBCode tags javascript
我有这个RegExp,但我不知道它怎么了
tag = new RegExp('(\\['+tag+'=("|'|)(.*?)\1\\])((?:.|\\r?\\n)*?)\\[/'+tag+']','g');
bbcode标记可以有双引号,单引号或无引号。
[tag="teste"]123[/tag]
[tag='teste']123[/tag]
[tag=teste]123[/tag]
捕获中所需的输出: teste
和123
要匹配可选引号,应为("|'|)
, (["|\\']*)
或("|\\'?)
?
首先,让我们更正字符串中的语法
您需要定义var tag
tag = 'tag'; result = new RegExp( <...> );
您在'("|'|) <...> '
没有多余的引号,需要将其转义为("|\\'|)
\\1
\\\\1
为\\\\1
所以现在我们有了表达式'(\\\\['+tag+'=("|\\'|)(.*?)\\\\1\\\\])((?:.|\\\\r?\\\\n)*?)\\\\[/'+tag+']'
,值:
(\[tag=("|'|)(.*?)\1\])((?:.|\r?\n)*?)\[/tag]
确实只有一件事,在("|\\'|)(.*?)\\\\1
您使用\\1
来匹配与用作开头的引号相同的引号。但是,1表示第一个捕获组(第一个括号从左到右),但是("|'|)
实际上是第二个括号集,第二个组。 您需要做的就是将其更改为\\2
。
(\[tag=("|'|)(.*?)\2\])((?:.|\r?\n)*?)\[/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到无限重复, |
在字符类中被解释为文字。 而是("|\\'?)
匹配单引号,双引号或不匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.