regex 当存在多个标记时,获取标记之间的字符串

wz8daaqr  于 2023-05-08  发布在  其他
关注(0)|答案(3)|浏览(135)

只是试图把这个问题解决为正则表达式,这与我的强项相去甚远:(基本上,我试图获得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
gajydyqb

gajydyqb1#

编辑:好的,我认为这符合你的需要。
我的正则表达式:

/[^\]\[]*\[(\w+)[=\.\"\w]*\][^\]]+\[\/\1\][^\]\[]*/g

说明:
1.匹配0个或多个不是[或]的字符
1.匹配单个[
1.匹配一个或多个字母字符,我们将在后面使用它作为反向引用
1.匹配0个或多个=。”或字母字符
1.匹配单个]
1.匹配1个或多个非[字符]
1.匹配单个[
1.匹配单个/
1.匹配与步骤3相同的字符。(我们的背面参考)
1.匹配单个]
1.匹配0个或多个不是[或]的字符
然而,我想说的是,如果你要解析bbcodes,你几乎肯定最好只使用bbparser。

jjhzyzn0

jjhzyzn02#

为什么不直接用空字符串替换所有这些标签呢

var rawString; // your input string
var cleanedString = rawString.replace(~\[/?(left|right|center)\]~, '');
tpgth1q7

tpgth1q73#

你可以使用这样的捕获组:

(?:\[\w+\])*(\w+)(?:\[\/\w+\])*

或者使用名为“value”的捕获组,如下所示:

(?:\[\w+\])*(?<value>\w+)(?:\[\/\w+\])*

第一组和最后一组是非捕获的。。(?: ...)中间的组捕获(\w+)中间的组如果命名为(?<value>\w+)
注意:为简单起见,我替换了您的中心|左|使用\w+来正确的值,但是您可以将它们交换回来而不会产生任何影响。
我使用一个叫做RegExRX的应用程序。下面是一个包含RegEx和捕获值的屏幕截图。

有很多方法可以调整它。祝你好运!

相关问题