【问题标题】:regex to change text inside a html tag正则表达式更改 html 标记内的文本
【发布时间】:2012-11-20 14:20:23
【问题描述】:

首先,我是 stackoverflow 的新手,如果我在错误的部分发布了此内容,我深表歉意。

我需要一个正则表达式在 html 标记中搜索并将 - 替换为 _ 例如:

<TAG-NAME>-100</TAG-NAME>

会变成

<TAG_NAME>-100</TAG_NAME>

请注意,标签内的值不受影响。

谁能帮忙?

谢谢。

【问题讨论】:

  • 欢迎来到stackoverflow!你能告诉我们你自己的尝试吗?您使用的是哪种语言或工具?最后是强制性的...you shouldn't use regex to parse HTML at all
  • 好吧,我正在使用其他东西来解析一些 xml。这不是一个真正的 html 标签,但我认为这会使事情更容易理解。我已经尝试过不同的 reg 表达式并在 regexpal 上测试它们,但没有帮助,要么我得到 -100 的 -,要么我也得到标签的文本......
  • @user1839059 对于 XML 来说,正则表达式并不比 HTML 更好;)。由于您使用的是正则表达式,我假设您使用 JavaScript?
  • jQuery 还是别的什么?如果您想要一个好的答案,您的应用程序使用的技术非常重要。

标签: javascript html regex replace tags


【解决方案1】:

由于 JavaScript 是用于 DOM 操作的 语言,您通常应该考虑正确解析 XML 并使用 JavaScript 的 DOM 遍历函数而不是正则表达式。

Here is some example code on how to parse an XML document 以便您可以使用 DOM 遍历功能。然后你可以遍历所有元素并更改它们的名称。这将自动排除文本节点、属性、cmets 和所有其他你不想更改的烦人的东西。

如果它必须是一个正则表达式,这里是一个临时的解决方案。请注意,如果您在属性名称或 cmets 中有标签(甚至只有 &gt;),它将严重失败(实际上它也会将替换应用于 cmets):

str = str.replace(/-(?=[^<>]*>)/g, '_');

这将匹配一个-,如果它后面跟着一个&gt;,而之前没有遇到&lt;。这个概念被称为negative lookaheadg 修饰符确保所有匹配项都被替换。

请注意,这会将替换应用于&gt; 前面的任何内容。甚至属性值。如果您不希望这样,您还可以确保连字符和结束 &gt; 之间有偶数个引号,如下所示:

str = str.replace(/-(?=[^<>"]*(?:"[^<>"]*"[^<>"]*)*>)/g, '_');

这仍然会改变属性 names

Here is a regexpal demo that shows what works and what doesn't work.尤其是评论行为相当恐怖。当然,这可以通过更复杂的正则表达式来解决,但我想你知道这是怎么回事吗?你应该真的,真的使用 XML 解析器!

【讨论】:

    【解决方案2】:
    s/(\<[^\>]+\>)\-([^\<]+\<\/)/\1_\2/
    

    虽然我不熟悉 JS 库,但我很确定会有更好的库来解析 HTML。

    【讨论】:

    • @m.buettner 否 :( 但这是一个通用的正则表达式,所以 JS 应该有类似的东西?
    • 是的,你的正则表达式的问题在于它必须运行多次(g 修饰符无济于事)因为匹配不能重叠。所以只会替换一个-
    • @m.buettner LOL 不知道 OP 是否需要多次更换。但是,如果需要替换其中的多个,则需要 g
    • 正如我所说,g 对您的正则表达式没有帮助,因为单个标签中多个连字符的匹配会重叠。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多