[英]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"));
说明 :对于每个匹配
>
: \\>
开头 >
也不是<
: [^\\>\\<]*
>
也不是<
: [^\\>\\<]*
<
: \\<
结尾 用。。。来代替
$1
$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.