从HTML字符串中删除重复的元素

时间:2014-10-29 07:06:42

标签: javascript jquery html regex

我有这个HTML:

<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'>
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'>
<input type=hidden' class='allDomObjects' value='' id='tab_5_data'>
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'>
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'>
<input type=hidden' class='allDomObjects' value='' id='tab_5_data'>
<input type=hidden' class='allDomObjects' value='grid_1' id='grid_1_domType'>

在此屏幕中,您可以看到类名相同,但它们的ID不同。

我写这个来获取所有字段:

$(unescape(HtmlString)).filter(".allDomObjects").each(function() {
    console.log(this.id);
}); 

这个.each()循环运行7次,因为7个字段有&#39; allDomObjects&#39;类。您可以看到此字符串中存在重复的元素。

要求:

我想从HTML字符串中删除重复的元素。

输入:

<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'>
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'>
<input type=hidden' class='allDomObjects' value='' id='tab_5_data'>
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'>
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'>
<input type=hidden' class='allDomObjects' value='' id='tab_5_data'>
<input type=hidden' class='allDomObjects' value='grid_1' id='grid_1_domType'>

期望的输出:

<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'>
<input type=hidden' class='allDomObjects' value='' id='tab_5_data'>
<input type=hidden' class='allDomObjects' value='grid_1' id='grid_1_domType'>

3 个答案:

答案 0 :(得分:2)

我认为您可以使用一些地图对象来存储ID:

var map = {};
$(unescape(HtmlString)).each(function() {
    if (map[this.id]) {
        $(this).remove();
    }
    else {
        map[this.id] = true;
    }
});

答案 1 :(得分:0)

你不能用容易出错的regex.its来解析html。如果你没有得到更好的解决方案,你可以试试这个。

<input\s+type=hidden'\s+class='allDomObjects'\s+value='[^']*'\s+id='([^']*)'>(?=.*?<input\s+type=hidden'\s+class='allDomObjects'\s+value='[^']*'\s+id='\1'>)

放置标记gs。请参阅empty string的demo.Replace。

http://regex101.com/r/sU3fA2/36

答案 2 :(得分:0)

试试这个。请记住,您需要在所有副本中保留第一个元素,因此从1

开始循环
$(unescape(HtmlString)).filter(".allDomObjects").each(function() {
    if ( $('[id="'+this.id+'"]').length > 1 ) {
        for ( var i = 1; i < $('[id="'+this.id+'"]').length, i++ ) {
            $('[id="'+this.id+'"]')[i].remove();
        }
    }
});