我正在尝试用正则表达式替换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。
有什么想法吗?非常感谢。
答案 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"));
解释:对于每次匹配
>
:\>
>
也不是<
:[^\>\<]*
>
也不是<
:[^\>\<]*
<
:\<
替换为
$1
$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<
但请注意在您的问题的第一条评论中链接的帖子中的所有精明建议!