从字符串中删除HTML标记及其内容的正则表达式是什么

时间:2014-05-12 18:43:26

标签: javascript regex

我想捕获两个HTML标记之间的所有内容,包括内容和标记。我认为它不一定非常强大,但理想情况下它可以处理这种边缘情况:

foo <div>>bar</div>> baz

返回应该是:

foo > baz

我尝试了什么:

有很多RegExs for stripping out HTML tags,但我没有找到任何可以删除内容的东西。到目前为止,我有这个:

\<(.*)\>

但这是贪婪的并且返回

foo  bar

4 个答案:

答案 0 :(得分:3)

您可以解析DOM而不是使用RegExp:

var text = [];
var TEXT_NODE = 3;

Array.prototype.forEach.call(
   document.getElementById('test').childNodes,
   function (n) {
      if (n.nodeType === TEXT_NODE)
         text.push(n.textContent)
   }
);
console.log(text.join(''));

http://jsfiddle.net/S5CT3/

答案 1 :(得分:2)

我知道你要求Regex,but you can do it more robustly by interacting with the DOM

<div id="test">foo <div>>bar</div>> baz</div>
alert(
    document.getElementById('test').firstChild.nodeValue +
    document.getElementById('test').lastChild.nodeValue
); 
// foo > baz

答案 2 :(得分:1)

我将在这里借用@JuanMendes的答案,但总结一下 - 毕竟,你可能不仅仅有两个这样的节点;)

function strip(source) {
    var div = document.createElement('div');
    div.innerHTML = source;
    var nodes = div.childNodes;
    var retarr = [];
    for( var i = nodes.length-1; i >= 0; i--) {
        if( nodes[i].nodeType == 3) retarr.unshift(nodes[i].nodeValue);
    }
    return retarr.join("");
}

var html = "foo <div>>bar</div>> baz";
alert(strip(html)); // foo > baz

Demo on jsFiddle

答案 3 :(得分:-3)

试试这个:

var subject = "foo <div>>bar</div>> baz";
var result = subject.replace(/^(.*?)(?:<.*>)(.*?)$/, "$1>$2");
console.log(result);
//foo > baz

LIVE DEMO