在字符串中删除不需要的标记(没有JQuery)

时间:2011-11-15 02:26:22

标签: javascript

我有一个包含以下内容的字符串:

<span>A</span>BC<span id="blabla">D</span>EF

我希望能够将regx表达式的JavaScript替换功能用于仅删除没有id的跨度。所以结果看起来像

ABC<span id="blabla">D</span>EF

我对使用jQuery真的不感兴趣。我宁愿使用纯JavaScript来解决问题。我有以下但似乎没有正常工作

myText.replace(/(<([^>]+)>)/ig,"");

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

使用DOM,而不是正则表达式。

var input = '<span>A</span>BC<span id="blabla">D</span>EF',
    output,
    tempElt = document.createElement('span');

tempElt.innerHTML = input;

// http://www.quirksmode.org/dom/w3c_html.html#t03
if (tempElt.innerText) output = tempElt.innerText;
else output = tempElt.textContent;

console.log(output); // "ABCDEF"

演示:http://jsfiddle.net/mattball/Ctrkf/


<子> "It is tempting, if the only tool you have is a hammer, to treat everything as if it were a nail."

答案 1 :(得分:1)

像这样的东西可以完成这项工作,但它不使用正则表达式(但它也不使用jQuery,因此两个中的一个也不错)。

var s = '<span>A</span>BC<span id="blabla">D</span>EF';

function removeSpans(s) {
  var a = document.createElement('div');
  var b = a.cloneNode(true);
  a.innerHTML = s;
  var node;
  while (a.firstChild) {
    node = a.removeChild(a.firstChild);
    if (node.tagName && 
        node.tagName.toLowerCase() == 'span' &&
        node.id == '') {
        b.appendChild(document.createTextNode(getText(node)));
    } else {
      b.appendChild(node);
    }
  }
  return b.innerHTML;
}

alert(removeSpans(s));

它不是特别健壮(实际上它比我想象的要好),并且在与测试用例略有不同的情况下可能会失败。但它显示了战略。

这是另一个版本,但非常相似:

function removeSpans2(s) {
  var a = document.createElement('div');
  a.innerHTML = s;
  var node, next = a.firstChild;

  while (node = next) {
    next = next.nextSibling

    if (node.tagName && node.tagName.toLowerCase() == 'span' && !node.id) {
      a.replaceChild(document.createTextNode(node.textContent || node.innerText), node);
    }
  }
  return a.innerHTML;
}