只是试图把这个问题解决为正则表达式,这与我的强项相去甚远:(基本上,我试图获得bbcode标签之间的值:这可能看起来像以下任何一种:
[center]text[/center]
[left][center]text[/center][/left]
[right][left][center]text[/center][/left][/right]
目前有这个可怕的if else
代码块,以防止它像上面的第三个选项一样变大。
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
3条答案
按热度按时间gajydyqb1#
编辑:好的,我认为这符合你的需要。
我的正则表达式:
说明:
1.匹配0个或多个不是[或]的字符
1.匹配单个[
1.匹配一个或多个字母字符,我们将在后面使用它作为反向引用
1.匹配0个或多个=。”或字母字符
1.匹配单个]
1.匹配1个或多个非[字符]
1.匹配单个[
1.匹配单个/
1.匹配与步骤3相同的字符。(我们的背面参考)
1.匹配单个]
1.匹配0个或多个不是[或]的字符
然而,我想说的是,如果你要解析bbcodes,你几乎肯定最好只使用bbparser。
jjhzyzn02#
为什么不直接用空字符串替换所有这些标签呢
tpgth1q73#
你可以使用这样的捕获组:
或者使用名为“value”的捕获组,如下所示:
第一组和最后一组是非捕获的。。
(?: ...)
中间的组捕获(\w+)
中间的组如果命名为(?<value>\w+)
注意:为简单起见,我替换了您的中心|左|使用\w+来正确的值,但是您可以将它们交换回来而不会产生任何影响。
我使用一个叫做RegExRX的应用程序。下面是一个包含RegEx和捕获值的屏幕截图。
有很多方法可以调整它。祝你好运!