js regex:替换不在span标记中的单词

时间:2015-10-12 11:41:02

标签: javascript html regex

例如:

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

感谢。

1 个答案:

答案 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.createTreeWalkerSHOW_TEXT过滤器,我们可以访问所有文本节点。我们遍历节点,如果节点名称不是span,或者如果它是具有title值不等于“mark”的title属性的span标记,我们执行搜索并替换。