替换除 <strong>、</strong>、<b> 和 </b> 之外的所有 HTML 标签

Replace all HTML tags except for <strong>, </strong>, <b> and </b>

在 JavaScript 中,我使用此正则表达式从文本字符串中删除所有 HTML 标签:

t.replace(/<\/?[^>]+>/g, '');

现在我需要同样的东西,但它应该保留以下标签(它们不应该被替换):

<strong>
</strong>
<b>
</b>

你能帮帮我吗?我通常不使用正则表达式,所以如果这听起来太简单,请原谅。

只需使用否定的先行断言。

var s = '<strong> </strong>\n<b> </b> <h1> <h2> <a href="foo.com">';
alert(s.replace(/<(?!\/?b>|\/?strong>)[^>]+>/g, ''));

(?!\/?b>|\/?strong>) 开始时的否定前瞻断言匹配,即 < 后面不会跟着 /b>b>/strong>strong> 个字符串。

RegEx DEMO

你也可以试试这个:

t.replace(/<(?!\/?(b|strong)(?=>|\s.*>))\/?.*?>/g, '')

我会通过 DOM:

来解决这个问题

var s = '<ol><li>hello </li><li><b>world</b></li></ol>';

var node = document.createElement('div');
node.innerHTML = s;

function clean(node, allowed, target)
{
  for(var i = 0; i < node.childNodes.length; ++i)
  {
    var child = node.childNodes[i];
    if (child.nodeType === 1) {
      clean(child, allowed, target);
      if (allowed.indexOf(child.nodeName) === -1) {
        [].forEach.call(child.childNodes, function(item) {
          target.appendChild(item);
        });
        node.removeChild(child);
        --i;
      }
    }
  }
}

clean(node, ['STRONG', 'B'], node);
console.log(node.innerHTML);

您还可以通过在 JavaScript 中实施 strip_tags() 来选择更脏的版本。