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]
捕获中的所需输出:teste
和 123
要匹配可选的引号,应该是("|'|)
、(["|\']*)
或("|\'?)
?
字符串有什么问题
首先,让我们更正字符串中的语法
你需要定义变量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.
我有这个正则表达式,但我不知道它有什么问题
tag = new RegExp('(\['+tag+'=("|'|)(.*?)\])((?:.|\r?\n)*?)\[/'+tag+']','g');
bbcode 标签可以有双引号、单引号或无引号。
[tag="teste"]123[/tag]
[tag='teste']123[/tag]
[tag=teste]123[/tag]
捕获中的所需输出:teste
和 123
要匹配可选的引号,应该是("|'|)
、(["|\']*)
或("|\'?)
?
字符串有什么问题
首先,让我们更正字符串中的语法
你需要定义变量
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.