Jquery: Supprimer toutes les balises HTML spécifiques de la chaîne

J’ai une variable qui contient une chaîne de texte et des balises HTML, telles que:

var temp = "
Some text

More texthere

Even more

";

Je voudrais supprimer toutes les balises d’un certain type. Disons toutes les balises p et span par exemple.

C’est le meilleur que je puisse trouver:

 var temp = "
Some text

More texthere

Even more

"; var $temp = $(temp); $("p", $temp).replaceWith("foo"); alert($temp.html()); //returns "Some text"

La réponse la plus proche que j’ai pu trouver est cette réponse de Nick Craver: dénudez les balises span de ssortingng avec jquery .

Démo: http://jsfiddle.net/VwTHF/1/

 $('span, p').contents().unwrap(); 

.contents() obtiendra les éléments et le texte contenus dans chacune de ces balises, et .unwrap supprimera l’élément qui .unwrap chaque section de contenu.

Selon votre approche actuelle, cela ressemblerait à ceci:

 var temp = "
Some text

More texthere

Even more

"; var $temp = $(temp); $temp.find('span, p').contents().unwrap().end().end();

Si vous souhaitez continuer à cibler l’object d’origine, vous devez utiliser .end() pour effacer le filtre.

Vous pouvez essayer le plugin jquery HTML Clean . Dans l’exemple, ils fournissent:

 $.htmlClean("

Nested P Test

", {format:true}); =>

Nested P Test

Vous pouvez remplacer des balises spécifiques par {removeTags:[p]} et restituera le contenu mais pas la balise.

Je devais faire quelque chose de similaire: empêcher un bloc de texte de contenir une balise HTML autre que , ou . Cette question et plusieurs autres m’ont orientée vers ma propre fonction:

 function cleanNonFormattingTags(htmlContents) { if (htmlContents && htmlContents.length) { var result = ''; htmlContents.each(function () { var $child = $(this), type = $child.prop('tagName'), isTextNode = this.nodeName == "#text"; if (isTextNode) { result += this.textContent; } else if (type == 'B' || type == 'U' || type == 'I' || type == 'BR') { // Allow only these types of tags var innerContent = cleanNonFormattingTags($child.contents()); var $newTag = $(document.createElement(type)).html(innerContent); result += $newTag[0].outerHTML; } else { result += cleanNonFormattingTags($child.contents()); } }); return result; } return htmlContents.text(); } 

J’espère que cela t’aides!

Je ferai un suivi sur @nbrooks car sa réponse est très proche de ce que vous voulez, mais pas tout à fait. @nbrooks a choisi la solution en notant que html () vous donne les données encapsulées dans une balise. La solution consiste donc à envelopper votre code HTML dans une balise. Cela devrait faire l’affaire pour vous:

 var temp = "
Some text

More texthere

Even more

"; $("" + temp + "").find('span,p'). contents().unwrap().end().end().html()`

Voir http://jsfiddle.net/18u5Ld9g/1/ pour un exemple.

En tant que fonction plus générale:

 function ssortingpTags(html, tags) { // Tags must be given in CSS selector format return $("" + html + "").find(tags). contents().unwrap().end().end().html(); }