只是想弄清楚这个问题,因为正则表达式离我的强项还很远:( 基本上我正在尝试获取 bbcode 标签之间的值:这可能看起来像以下之一:
[center]text[/center]
[left][center]text[/center][/left]
[right][left][center]text[/center][/left][/right]
目前有这个可怕的 if else
代码块来防止它像上面的 third 选项一样变大。
if (/\[left\]|\[\/left\]/.test(text[2])) {
// set the value in the [left][/left] tags
text[2] = text[2].match(/\[left\](.*?)\[\/left\]/)[1];
} else if (/\[right\]|\[\/right\]/.test(text[2])) {
// set value in the [right][/right] tags
text[2] = text[2].match(/\[right\](.*?)\[\/right\]/)[1];
} else if (/\[center\]|\[\/center\]/.test(text[2])) {
// set value in the [right][/right] tags
text[2] = text[2].match(/\[center\](.*?)\[\/center\]/)[1];
}
我想做的是将它缩短为单个正则表达式以从上面的示例中获取值 text
,我已经简化为这样的表达式:
/\[(?:center|left|right)\](.*?)\[\/(?:center|left|right)\]/
但正如您在这个 RegExr demo 中看到的那样,它不符合我的需要。
我怎样才能做到这一点?
注意事项
它应该只匹配 left|right|center
因为所选文本还可以有各种其他 bbcode 标签。
如果字符串看起来像这样:
[center][left][img]/link/to/img.png[/img][/left][/center]
我想获取 left|center|right
标签之间的内容,在本例中为:
[img]/link/to/img.png[/img]
更多例子:
[center][url=lintosomething.com]LINK TEXT[/url][/center]
应该只得到:[url=lintosomething.com]LINK TEXT[/url]
或者
[center]egibibskdfbgfdkfbg sd fgkgb fkgbgk fhwo3g regbiurb geir so go to [url=lintosomething.com]LINK TEXT[/url] and ibgri gbenkenbieurgnerougnerogrnreog erngo[/center]
想要:
egibibskdfbgfdkfbg sd fgkgb fkgbgk fhwo3g regbiurb geir so go to [url=lintosomething.com]LINK TEXT[/url] and ibgri gbenkenbieurgnerougnerogrnreog erngo
最佳答案
编辑:好的,我认为这符合您的需求。
我的正则表达式:
/[^\]\[]*\[(\w+)[=\.\"\w]*\][^\]]+\[\/\1\][^\]\[]*/g
解释:
- 匹配 0 个或多个不属于 [ 或 ] 的字符
- 匹配单个 [
- 匹配 1 个或多个字母字符,稍后我们将使用它作为反向引用
- 匹配 0 个或多个 = 。 "或字母字符
- 匹配单个 ]
- 匹配 1 个或多个非 [ 字符
- 匹配单个 [
- 匹配单个/
- 匹配与步骤 3 相同的字符。(我们的反向引用)
- 匹配单个 ]
- 匹配 0 个或多个不属于 [ 或 ] 的字符
但是我想声明,如果您要解析 bbcode,您几乎肯定只使用 bbparser 会更好。
关于javascript - 当存在多个标签时获取标签之间的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24196471/