当存在多个标签时,在标签之间获取字符

时间:2014-06-13 01:36:10

标签: javascript regex

试图把这个想象成正则表达式远不及我的强点:( 基本上我正试图获取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标记。

如果字符串如下所示:

[中心] [左] [IMG] /link/to/img.png [/ IMG] [/左] [/中心]

我希望得到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 个答案:

答案 0 :(得分:2)

为什么不用空字符串

替换所有这些标签
var rawString; // your input string
var cleanedString = rawString.replace(~\[/?(left|right|center)\]~, '');

答案 1 :(得分:2)

编辑:好的,我认为这符合您的需求。

我的正则表达式:

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

说明:

  1. 匹配0个或多个不是[或]
  2. 的字符
  3. 匹配单个[
  4. 匹配1个或多个字母字符,我们稍后会将其用作反向引用
  5. 匹配0或更多=。 "或字母字符
  6. 匹配单个]
  7. 匹配1个或更多非[字符
  8. 匹配单个[
  9. 匹配单个/
  10. 匹配与步骤3相同的字符。(我们的背面参考)
  11. 匹配单个]
  12. 匹配0个或多个不是[或]
  13. 的字符

    <强> See it in action

    但是我想说的是,如果你要解析bbcodes,你几乎肯定会更好地使用bbparser。

答案 2 :(得分:1)

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

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

或者使用名为&#34;值&#34;的捕获组像这样:

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

第一组和最后一组是非捕获的...... (?: ...) 中间组正在抓取(\w+) 中间组如果命名为(?<value>\w+)

注意:为简单起见,我用\ w +替换了你的中心|左|右值,但是你可以将它们交换回来而没有任何影响。

我使用名为RegExRX的应用。这是一个包含RegEx和捕获值的屏幕截图。 enter image description here

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