【问题标题】:Regex to strip BBCode正则表达式剥离 BBCode
【发布时间】:2009-05-11 12:48:00
【问题描述】:

我需要一个正则表达式来去除字符串中的任何 BBCode。我有以下(和一个带有标签的数组):

new RegExp('\\[' + tags[index] + '](.*?)\\[/' + tags[index] + ']');

它可以很好地提取 [tag]this[/tag],但在使用 [url=http://google.com]this[/url] 时失败。

我需要改变什么?非常感谢。

【问题讨论】:

  • 所以你宁愿删除你在tags数组中给出的任何标签。

标签: javascript regex bbcode


【解决方案1】:

我遇到了这个线程,发现它有助于让我走上正确的轨道,但这是我花了两个小时为 JavaScript 构建的终极线程(这是我的第一个 RegEx!),并且经过测试可以很好地用于疯狂的巢穴甚至错误嵌套的字符串,它可以正常工作!:

string = string.replace(/\[\/?(?:b|i|u|url|quote|code|img|color|size)*?.*?\]/img, '');

如果 string = "[b][color=blue][url=www.google.com]Google[/url][/color][/b]" 则新字符串将为“Google”。太棒了。

希望有人觉得这很有用,这是 Google 中“JavaScript RegEx strip BBCode”的最佳匹配;)

【讨论】:

  • 谢谢 - 这是页面上唯一对我有用的解决方案。
【解决方案2】:

您必须允许在标记后使用除“]”以外的任何字符,直到找到“]”。

new RegExp('\\[' + tags[index] + '[^]]*](.*?)\\[/' + tags[index] + ']');

您可以将其简化为以下表达式。

\[[^]]*]([^[]*)\[\\[^]]*]

问题在于,它也会匹配[WrongTag]stuff[\WrongTag]。匹配嵌套标签需要多次使用表达式。

【讨论】:

  • 当您的目标是取出任何 BBcode 标签时,为什么还要对标签嵌套感兴趣?
  • [^]] 需要转义到 [^\\]]
【解决方案3】:

您可以使用反向引用检查平衡标签:

 new RegExp('\\[(' + tags.Join('|') + ')[^]]*](.*?)\\[/\\1]');

真正的问题是你不能匹配正则表达式中的任意嵌套标签(这是正则语言的限制)。某些语言确实允许递归正则表达式,但这些是扩展(从技术上讲,它们是非正则表达式,但不会更改大多数人用于对象的名称)。

如果你不关心平衡标签,你可以去掉你找到的任何标签:

 new RegExp('\\[/?(?:' + tags.Join('|') + ')[^]]*]');

【讨论】:

  • 平衡标签在这里完全无关紧要。 OP希望标签被删除,而不是匹配。
【解决方案4】:

要去除任何 BBCode,请使用以下内容:

string alltags = tags.Join("|");
RegExp stripbb = new RegExp('\\[/?(' + alltags + ')[^]]*\\]');

用空字符串全局替换。不需要额外的循环。

【讨论】:

  • [^\\]] 不匹配除 ']' 以外的字符,而是匹配除后跟 ']' 的 '\' 以外的字符,因为您不能在第一个位置转义 ']'。正确的是 [^]]。
  • 字符类中没有“跟随”。如果有的话,字符类匹配除“\”和“]”之外的所有内容。我会去掉多余的反斜杠。
【解决方案5】:

我遇到了类似的问题——在 PHP 而不是 Javascript 中——我不得不去掉 BBCode [quote] 标签以及标签中的引号。增加的问题是 [quote] 标记内通常有任意附加内容,例如[quote:7e3af94210="username"]

这对我有用:

$post = preg_replace('/[\r\n]+/', "\n", $post);
$post = preg_replace('/\[\s*quote.*\][^[]*\[\s*\/quote.*\]/im', '', $post);
$post = trim($post);

第 1 行和第 3 行只是为了整理任何额外的换行符,以及由于正则表达式而留下的任何换行符。

【讨论】:

    【解决方案6】:

    我认为

    new RegExp('\\[' + tags[index] + '(=[^\\]]+)?](.*?)\\[/' + tags[index] + ']');
    

    应该这样做。然后你必须选择第 2 组,而不是第 1 组。

    【讨论】:

    • [^\\]] 不匹配除 ']' 以外的字符,而是匹配除后跟 ']' 的 '\' 以外的字符,因为您不能在第一个位置转义 ']'。正确的是 [^]]。
    【解决方案7】:

    请记住,默认情况下,许多(大多数?)正则表达式风格不会让 DOT 元字符匹配行终止符。导致像

    这样的标签
    "[foo]dsdfs
    fdsfsd[/foo]"
    

    失败。通过向正则表达式添加“(?s)”来启用 D​​OTALL,或者将正则表达式中的 DOT 元字符替换为字符类 [\S\s]

    【讨论】:

      【解决方案8】:

      这对我有用,适用于每个标签名称。它还支持像'[url="blablabla"][/url]'这样的字符串

      str = str.replace(/\[([a-z]+)(\=[\w\d\.\,\\\/\"\'\#\,\-]*)*( *[a-z0-9]+\=.+)*\](.*?)\[\/\1\]/gi, "$4")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-17
        • 2012-04-20
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多