正则表达式来改变HTML标记内的文本

问题描述:

首先我是新来的*,所以我很抱歉,如果我发布在错误的部分。正则表达式来改变HTML标记内的文本

我需要一个正则表达式的HTML标签中搜索并替换 - 用_ 例如:

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

将成为

<TAG_NAME>-100</TAG_NAME> 

需要注意的是,在标签内的值不影响。

任何人都可以帮忙吗?

谢谢。

+4

欢迎使用*!你能向我们展示你自己的尝试吗?你使用哪种语言或工具?最后强制性的...... [你不应该使用正则表达式来解析HTML](http://*.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) –

+0

那么我正在使用别的东西来解析一些xmls。这不是一个真正的html标签,但我认为这会让东西变得更容易理解。我尝试过,如果不同的reg表达式并在regexpal上测试它们,但没有帮助,或者我得到-100,或者我也得到标记的文本... – user1839059

+0

@ user1839059正则表达式aren'对于XML比HTML更好)。既然你使用正则表达式,我假设你使用JavaScript? –

由于JavaScript是语言DOM操作,你通常应该考虑适当地解析XML和使用,而不是正则表达式JavaScript的DOM遍历功能。

Here is some example code on how to parse an XML document这样就可以使用DOM遍历函数。然后,您可以遍历所有元素并更改其名称。这将自动排除文本节点,属性,评论和所有其他恼人的事情,你不想改变。

如果它是一个正则表达式,这里是一个临时解决方案。请注意,这将严重失败,您是否有属性名称或注释标签内(甚至只有>)(事实上,它也将适用于更换,以评论):

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

这将与-如果是之后是>,之前未遇到<。这个概念被称为negative lookaheadg修饰符确保所有的事件都被替换。

请注意,这将替换为>前面的任何内容。即使属性值。如果你不想,你也可以确保有偶数连字符和结束>,这样之间的报价:

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

这仍然会改变属性虽然。

Here is a regexpal demo that shows what works and what doesn't work.特别是评论行为是相当可怕的。当然,这可以用一个更复杂的正则表达式来处理,但是我想你会看到这是怎么回事?你真的应该,真的使用XML解析器!

+0

非常感谢,这正是我想要的。 – user1839059

s/(\<[^\>]+\>)\-([^\<]+\<\/)/\1_\2/ 

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

+0

不是真的JS,是吗? ;) –

+0

@ m.buettner否:(但它是一个普通的正则表达式,所以JS应该有类似的东西? – texasbruce

+0

是的,你的正则表达式的问题是,它必须多次运行('g'修饰符不会帮助)因为匹配不能重叠,所以只有一个'-'会被替换 –