正则表达式替换HTML内容

时间:2011-05-18 07:26:02

标签: javascript regex

我正在尝试用正则表达式替换HTML内容。

<A HREF="ZZZ">test test ZZZ<SPAN>ZZZ test test</SPAN></A>

<A HREF="ZZZ">test test AAA<SPAN>AAA test test</SPAN></A>

请注意,只有HTML标记以外的字词才能从ZZZ替换为AAA。

有什么想法吗?非常感谢。

5 个答案:

答案 0 :(得分:7)

您可以遍历所有节点,替换文本节点中的文本(.nodeType == 3):

类似的东西:

element.find('*:contains(ZZZ)').contents().each(function () {
    if (this.nodeType === 3)
        this.nodeValue = this.nodeValue.replace(/ZZZ/g,'AAA')
})

或者没有jQuery:

function replaceText(element, from, to) {
    for (var child = element.firstChild; child !== null; child = child.nextSibling) {
        if (child.nodeType === 3)
            this.nodeValue = this.nodeValue.replace(from,to)
        else if (child.nodeType === 1)
            replaceText(child, from, to);
    }
}

replaceText(element, /ZZZ/g, 'AAA');

答案 1 :(得分:1)

在这种情况下,最好的想法是不要使用正则表达式来执行此操作。至少不是靠自己。 JavaScript肯定有某个HTML Parser?

如果你真的必须使用正则表达式,你可以尝试查找ZZZ的每个实例,后跟一个“&lt;”在任何“&gt;”之前。那看起来像是

ZZZ(?=[^>]*<)

如果代码包含HTML注释或脚本块,或者格式不正确,这可能会破坏。

答案 2 :(得分:0)

假设格式良好的html文档包含<html>等外部/封闭标记,我认为最简单的方法是查找><符号:

/(\>[^\>\<]*)ZZZ([^\>\<]*\<)/$1AAA$2/

如果你正在处理可能没有封闭标签的HTML片段,它会变得有点复杂,你必须允许字符串的开头和字符串的结尾

示例JS(抱歉,错过了标签):

alert('<A HREF="ZZZ">test test ZZZ<SPAN>ZZZ test test</SPAN></A>'.replace(/(\>[^\>\<]*)ZZZ([^\>\<]*\<)/g, "$1AAA$2"));

解释:对于每次匹配

  • >\>
  • 开头
  • 跟随任意数量的字符既不是>也不是<[^\>\<]*
  • 然后有“ZZZ”
  • 跟随任意数量的字符既不是>也不是<[^\>\<]*
  • <\<
  • 结尾

替换为

  • ZZZ之前的所有内容,标有第一个捕获组(括号):$1
  • AAA
  • ZZZ之后的所有内容,标有第二个捕获组(括号):$2

使用“g”(全局)选项确保替换所有可能的匹配。

答案 3 :(得分:0)

试试这个:

var str = '<DIV>ZZZ test test</DIV><A HREF="ZZZ">test test ZZZ</A>';
var rpl = str.match(/href=\"(\w*)\"/i)[1];
console.log(str.replace(new RegExp(rpl + "(?=[^>]*<)", "gi"), "XXX"));

答案 4 :(得分:0)

你尝试过这个:

取代:

>([^<>]*)(ZZZ)([^<>]*)<

with:

>$1AAA$3<

但请注意在您的问题的第一条评论中链接的帖子中的所有精明建议!