2017-03-10 1 views
0

J'essaye d'enlever les étiquettes de fermeture excessives dans javascript et tout ce qui suit après cela.Expression JavaScript pour supprimer les balises HTML de fermeture inégalées?

Voici un exemple possible:

<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> 

Toutes les idées sur la façon de le faire efficacement? La partie que je veux extraire est toujours un div, mais le problème est qu'il peut y avoir autant de divs imbriqués, et je ne suis pas sûr de savoir comment gérer ce scénario.

Si cela peut être fait en plusieurs étapes ou avec des rappels, c'est aussi bien, tant que cela fonctionne.

Modifier Ma question est en fait plus facile qu'il n'y paraît. L'exemple commence toujours par la div que je veux extraire. Tout ce dont j'ai besoin est de trouver la balise de fermeture correspondante et de filtrer tout ce qui suit. Ne pas se soucier des autres balises ...

+5

Voici une réponse terrible: http://stackoverflow.com/a/1732454/135078 –

+0

Regex est pas un outil d'analyse syntaxique. – Vallentin

+0

Quels sont précisément les tags que vous voulez supprimer? Tout en dessous des balises excessives ci-dessous commentaire? Le remorquage des étiquettes inégalées gardant le div pied de page? –

Répondre

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); 

j'ai pu le résoudre. Le code ci-dessus calcule le niveau d'imbrication div, puis le supprime s'il trouve des tags de fermeture excessifs.

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

+0

On dirait beaucoup de frais généraux pour rien de mieux que de simplement manipuler le DOM. –

+0

Oh, crois-moi, il y a un énorme gain. Ce script s'exécute en 0 ms, donc je suis plus qu'heureux. – Anonymous

2

N'utilisez pas regex, d'après ce que je comprends, vous voulez conserver la classe div divisée et la classe de pied div, alors pourquoi ne pas remplacer le corps avec ça?

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

Ce ne sont pas des éléments physiques. Ils n'existent pas dans DOM et je suis juste en train d'analyser une chaîne. Et non, je n'ai pas vraiment besoin du pied de page. Seul le div divin. – Anonymous

+0

Pourriez-vous créer un élément html, définir le contenu de la chaîne et exécuter le JS par rapport à cela? – derp

+0

Bonne réponse! Bon doge! Fondamentalement, la voie la plus propre pour faire face à un problème comme celui-ci. –