2017-03-10 59 views
0

我試圖刪除JavaScript中的過多結束標記以及之後的任何內容。JavaScript的正則表達式來移除不匹配的結束HTML標記?

這裏是一個可能的樣本:

<div class="dummy"> 
    <div class="main"> 
     <div></div> 
     <img src="a.jpg"> 
     <br> 
     <img src="b.jpg /> 
     <strong> 
      <span>text</span> 
     </strong> 
    </div> 
</div> 
    ***excessive tags below*** 
</div> 
</div> 
<div class="footer"> 
    text 
</div> 
</body> 
</html> 

有關如何有效地做到這一點任何想法? 我想要提取的部分始終是一個div,但問題是它可能具有儘可能多的嵌套div,並且我不確定如何處理此方案。

如果可以在多個步驟中完成,或者回調也很好,只要它可以工作。

編輯 我的問題實際上比看起來容易。 樣本始終以我想要提取的div開始。 所以我需要的是找到匹配的結束標記,並過濾任何後續內容。 不關心任何其他標籤...

+5

這是一個很好的答案:http://stackoverflow.com/a/1732454/135078 –

+0

正則表達式是不是一個分析工具。 – Vallentin

+0

準確地說,你想要移除的標籤是什麼?下面的標籤下面的所有內容都是評論?兩個不匹配的標籤保持頁腳div? –

回答

0
data='<div class="dummy"><div class="main"><div></div><img src="a.jpg"><br><div></div><img src="b.jpg /><strong><span>text</span> </strong></div><div><div></div></div><div><div></div></div></div>***excessive tags below***</div></div><div class="footer">text</div></body></html>'; 



var starting_tags = []; 
var closing_tags = []; 

     var startIndex, index=0; 
    var searchStrLen = 4; 
    while ((index = data.indexOf('<div', startIndex)) > -1) { 
     starting_tags.push(index); 
     startIndex = index + searchStrLen; 
    } 
    index,startIndex=0; 
    searchStrLen = 6; 
    while ((index = data.indexOf('</div>', startIndex)) > -1) { 
     closing_tags.push(index); 
     startIndex = index + searchStrLen; 
    } 

    var nest_level=0; 
    for (var i=0; i<closing_tags.length && nest_level<closing_tags.length && nest_level<=closing_tags.length; ++i) { 
     for (var j=0+nest_level; j<starting_tags.length; ++j) { 
       if (starting_tags[j]<closing_tags[nest_level]) 
      nest_level++; 
     } 
    } 
result = data.substr(startIndex[starting_tags], closing_tags[nest_level-1]+6);  

console.log(nest_level); 
console.log(starting_tags); 
console.log(closing_tags); 
console.log(result); 

我能解決這個問題。上面的代碼計算div嵌套的級別,然後在找到過多的結束標籤時將其切斷。

https://jsfiddle.net/89j7yakz/2/

+0

看起來很多開銷只是操縱DOM而沒有任何收穫。 –

+0

哦,相信我有巨大的收穫。這個腳本運行在0毫秒內,所以我非常高興。 – Anonymous

2

不要使用正則表達式,從我的理解,你想保留虛擬類div和頁腳類div所以爲什麼不用正則替換正文?

E.g.

var dummy = document.getElementsByClassName('dummy')[0]; 
var footer = document.getElementsByClassName('footer')[0] 

var body = document.getElementsByTagName('body')[0]; 
body.innerHTML = ''; 
body.appendChild(dummy); 
body.appendChild(footer); 

https://jsfiddle.net/1kq11ry2/

+0

那些不是物理元素。它們不存在於DOM中,我只是解析一個字符串。不,我實際上並不需要頁腳。只有虛擬股利。 – Anonymous

+0

您可以創建一個html元素,將其內容設置爲字符串,然後運行JS反對? – derp

+0

很好的回答!好夥計!基本上最清潔的路線來處理這樣的問題。 –

相關問題