例如:
var htmlString = "It's a <span title='mark'>nice day</span> and also a <span title=''>sunny day</span>, it's day for surfing.";
想要替换最后两个单词&#34; day&#34;使用&#34; night&#34;,然后跳过第一个标记为span标题&#34;标记&#34;。
var replaceString = "day";
var reg=new RegExp("(?!title=\'mark\'>).*"+replaceString+".*(?!<\/span>)","gi")
var bb=htmlString.replace(reg,"night");
alert(bb)
// I can not get the right result with the above code
// Final result wanted: "It's a <span title='mark'>nice day</span> and also a <span title=''>sunny night</span>, it's night for surfing.";
更新:以下作品,但仅匹配3&#34; day&#34;在一个句子中,如何使它匹配不确定数量的&#34; day&#34;?
alert(htmlString.replace(/(<span.*?'(?!mark)'>.*?)day(.*?<\/span>)|(?!>)day/gi, "$1night$2"));
感谢。
答案 0 :(得分:0)
以下是使用基于DOM的方法实现这一目标的方法:
function textNodesUnder(el){
var n, walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false);
while(n=walk.nextNode())
{
if (n.parentNode.nodeName.toLowerCase() !== 'span' ||
(n.parentNode.nodeName.toLowerCase() === 'span' &&
n.parentNode.getAttribute("title") !== 'mark'))
n.nodeValue = n.nodeValue.replace(/\bday\b/g, "night");
}
return el.firstChild.innerHTML;
}
function replaceTextNotInSpecificTag(s) {
var doc = document.createDocumentFragment();
var wrapper = document.createElement('myelt');
wrapper.innerHTML = s;
doc.appendChild( wrapper );
return textNodesUnder(doc);
}
var s = "It's a <span title='mark'>nice day</span> and also a <span title=''>sunny day</span>, it's day for <span>surfing day</span>.";
console.log(replaceTextNotInSpecificTag(s));
结果:
It's a <span title="mark">nice day</span> and also a <span title="">sunny night</span>, it's night for <span>surfing night</span>.
首先,我们创建一个文档片段,然后创建一个元素myelt
,然后将其作为子项附加到文档片段,允许我们使用dom解析器访问DOM节点。
然后,使用document.createTreeWalker
和SHOW_TEXT
过滤器,我们可以访问所有文本节点。我们遍历节点,如果节点名称不是span,或者如果它是具有title值不等于“mark”的title属性的span标记,我们执行搜索并替换。