【问题标题】:javascript replace() multiple bbcode instances with multiple htmljavascript replace() 具有多个 html 的多个 bbcode 实例
【发布时间】:2012-02-13 20:50:32
【问题描述】:

我需要获取 javascript replace() 函数以将 [b] 或 [/b] 的每个实例替换为 <b></b>。我用全局标签尝试了这个,但它不起作用并且奇怪地出现:

document.write(str.replace(/[b]/g,'<b>').replace(/[/b]/g,'</b>'));

导致输出为:

[<>]<>la<>la[<>][<>]<>la<>la[<>] 

我也尝试将第一部分更改为:

  document.write(str.replace(/[[b]]/g,'<b>').replace(/[[/b]]/g,'</b>'));

哪种有效,但到处都有奇怪的 ]... 像这样:

[blabla[/[blabla[/

我知道我可能在这里缺少一些明显的东西......但我找不到它......任何帮助,我会永远爱你 XD

【问题讨论】:

    标签: javascript html replace bbcode


    【解决方案1】:

    []/special RegExp characters

    • [a] 表示:匹配任何 a 字符。 [abcd] 表示:匹配一个字符,即 a、b、c、d 之一。 [a-z] 表示:匹配任意字母。
    • / 用于标记正则表达式的开始和结束。

    要使用文字字符,它们必须被转义。

    str.replace(/\[b\]/g,'<b>').replace(/\[\/b\]/g,'</b>')
    

    请注意,两个正则表达式都可以使用反向引用合并:

    str.replace(/\[(\/?)b\]/g,'<$1b>')
    // Replaces [b] with <b>, [/b] with </b>
    

    【讨论】:

    • 感谢您提供有关特殊字符的信息,并及时注明 ^-^ 我希望我可以选择正确的两个答案!
    • @user1054798 您可以接受最有帮助的答案(= 解决了您的问题,最好有明确的解释)。此答案应该是在问题帖子中发布的核心问题的答案。此外,您还可以为真正有帮助的帖子投票,例如奖励提示。
    • 我没有必要的声誉来投票,但我的目标是在我达到它后立即为所有问题这样做:D 我将使用发布的所有解决方案进行更多测试,以看看哪个最适合我的需求!
    • 是的,刚才我看到rep增加的时候就这样做了:D不想重复发帖,有些论坛认为这很麻烦......
    【解决方案2】:

    一次替换它们可能会更好:

     str = "[b]foo[/b] and [b]bar[/b]"
     str.replace(/\[b\](.+?)\[\/b\]/g,'<b>$1</b>') // <b>foo</b> and <b>bar</b>
    

    您还可以更进一步,用一个正则表达式处理多个格式代码(本例中为 b、i、u 和 s):

    str = "[b]foo[/b] and [i]bar[/i]"
    str.replace(/\[([bius])\](.+?)\[\/\1\]/g,'<$1>$2</$1>')
    

    像这样的表达式(带有(.+?))比你的更好,因为它们只处理有效的标记并忽略未关闭的[标签]。

    【讨论】:

    • 如果嵌套相同类型的 BB 代码元素,这将不起作用。例如,如果您在列表中有列表,它将跳过标签。 [li][ul][li][/li][/ul][/li] 将匹配第一个 [li] 和第一个 [/li] 留下第二个 [li] 并且无法匹配,除非您运行两次替换。
    • @BenjaminUdinktenCate:当然,您不能仅使用正则表达式解析嵌套标记,至少在缺少递归构造的 javascript 风格中是这样。尽管如此,我认为我的解决方案对于 OP 的要求“足够好”,这显然比您的示例简单得多。
    • 谢谢!我之前在某个地方看到过 (.+?) 部分,但无法弄清楚它们的用途(我认为它们是正在更改的部分或其他东西......代码运行良好,你为我节省了 /lot/麻烦不得不为那里的各种 bbcode 做一个 :D 对不起,麻烦了,但你能告诉我,我怎么能用
      替换任何 Enter 以及用 html 等价物替换 [quote] 之类的东西?数字替换 bius 只会导致它替换任何 q、u、o、t 或 e...而且嵌套并不是真正的问题 atm XD 这要简单得多:P
    • @user1054798 .+? 匹配不够。例如,它不包括换行符。您必须使用匹配所有字符的[\S\s]+?。对于 BB 解析器,简单的 RegExp不够的。我之前写过一个运行良好的 JavaScript BBCode 解析器(代码脱机),但(部分)逻辑发布在this answer
    • 你会建议我使用 + 吗?而不是 .+?然后没有括号?我会检查解析器,谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多