繁体   English   中英

正则表达式替换HTML内容

[英]Regular expression to replace HTML content

我试图用正则表达式替换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。

任何想法? 非常感谢提前。

您可以遍历所有节点,替换文本节点中的文本(.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');

在这种情况下最好的想法是肯定不使用正则表达式来做到这一点。 至少不是靠自己。 JavaScript确实在某个地方有一个HTML Parser?

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

ZZZ(?=[^>]*<)

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

假设一个结构良好的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”(全局)选项确保替换所有可能的匹配。

尝试这个:

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"));

你试过这个:

更换:

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

有:

>$1AAA$3<

但要注意在你的问题的第一个评论中链接的帖子中的所有精明建议!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM