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

What's a regex to strip out both HTML tags and their contents from a string

本文关键字:正则表达式 是什么 字符串 HTML      更新时间:2023-09-26

我想捕获两个HTML标记之间的所有内容,包括内容和标记。我想它不必那么健壮,但理想情况下它可以处理这种边缘情况:

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

返回值应该是:

foo > baz

我试过了:

有很多用于剥离HTML标签的regex,但我还没有发现任何也剥离内容的regex。到目前为止,我有这个:

'<(.*)'>

但是那是贪婪的并且返回

foo  bar

您可以解析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/

我知道您要求使用Regex,但您可以通过与DOM交互来实现更健壮的功能

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

我将在这里借用@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

jsFiddle演示

试试这个:

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

现场演示