一个正则表达式,用于从JS中的HTML标记中删除id、样式和类属性

A regex to remove id, style, class attributes from HTML tags in JS

本文关键字:删除 id 属性 样式 HTML 中的 一个 正则表达式 JS 用于      更新时间:2023-09-26

我在javascript中得到了一个html字符串,我想使用regex删除html标记中的id、样式和类属性,例如:

New York City.<div style="padding:20px" id="upp" class="upper"><div style="background:#F2F2F2; color:black; font-size:90%; padding:10px 10px; width:500px;">This message is.</div></div>

我希望这个字符串变成:

New York City.<div><div>This message is.</div></div>

您可以利用所有浏览器中可用的DOM功能,而不是使用正则表达式解析HTML(这是个坏主意)。我们首先需要能够遍历DOM树:

var walk_the_DOM = function walk(node, func) {
    func(node);
    node = node.firstChild;
    while (node) {
        walk(node, func);
        node = node.nextSibling;
    }
};

现在解析字符串并操作DOM:

var wrapper= document.createElement('div');
wrapper.innerHTML= '<!-- your HTML here -->';
walk_the_DOM(wrapper.firstChild, function(element) {
    if(element.removeAttribute) {
        element.removeAttribute('id');
        element.removeAttribute('style');
        element.removeAttribute('class');
    }
});
result = wrapper.innerHTML;

另请参阅此JSFiddle。

如果您愿意删除除div标记名之外的所有内容-

string=string.replace(/<(div)[^>]+>/ig,'<$1>');

如果html为大写,则返回<DIV>

如果您只想删除属性,那么regex是错误的工具。我建议:

function stripAttributes(elem){
    if (!elem) {
        return false;
    }
    else {
        var attrs = elem.attributes;
        while (attrs.length) {
            elem.removeAttribute(attrs[0].name);
        }
    }
}
var div = document.getElementById('test');
stripAttributes(div);

​JS Fiddle演示。

我使用了这个

var html = 'New York City.<div style="padding:20px" id="upp"
class="upper"><div style="background:#F2F2F2; color:black; font-size:90%; padding:10px 10px; width:500px;">This message is.</div></div>';
function clear_attr(str,attrs){
    var reg2 = /'s*('w+)='"[^'"]+'"/gm;
    var reg = /<'s*('w+).*?>/gm;
    str = str.replace(reg,function(match, i) {
        var r_ = match.replace(reg2,function(match_, i) {
            var reg2_ = /'s*('w+)='"[^'"]+'"/gm;
            var m = reg2_.exec(match_);
            if(m!=null){
                if(attrs.indexOf(m[1])>=0){
                    return match_;
                }
            }
            return '';
        });        
        return r_;
    });
    return str;
}
clear_attr(html,[]);

使用正则表达式。这是快速的(在生产时间)和容易的(在开发时间)。

htmlCode = htmlCode.replace(/<([^ >]+)[^>]*>/ig,'<$1>');

尝试使用正则表达式解析HTML会导致问题。这个答案可能有助于解释它们。如果你正在使用jQuery,你可能可以做这样的事情:

var transformedHtml = $(html).find("*").removeAttr("id").removeAttr("style").removeAttr("class").outerHTML()

为了实现这一点,您需要使用此处描述的outerHTML插件。

如果你不想使用jQuery,那就更麻烦了。关于如何将字符串转换为DOM元素的集合,这些问题可能有一些有用的答案:将HTML字符串转换成DOM元素?,使用内置的DOM方法或原型从HTML字符串创建新的DOM元素。您可以使用内置的removeAttr函数循环遍历元素并删除属性。我没有时间也没有动力为你弄清楚所有的细节。

一个简单的脚本解决方案应该类似于:

function removeProperties(markup) {
  var div = document.createElement('div');
  div.innerHTML = markup;
  var el, els = div.getElementsByTagName('*');
  for (var i=0, iLen=els.length; i<iLen; i++) {
    el = els[i];
    el.id = '';
    el.style = '';
    el.className = '';
  }
  // now add elements to the DOM
  while (div.firstChild) {
   // someElement.appendChild(div.firstChild);
  }
}

一个更通用的解决方案是将属性名称作为额外的参数,或者说是一个空格分隔的字符串,然后迭代这些名称以删除它们。

我不知道RegEx,但我肯定知道jQuery。

将给定的HTML字符串转换为DOM元素,对其进行解析,并返回其内容。

function cleanStyles(html){
    var temp = $(document.createElement('div'));
        temp.html(html);
        temp.find('*').removeAttr('style');
        return temp.html();
}