2009-11-09 9 views
10

Existe-t-il une expression régulière qui peut supprimer complètement une balise HTML? En passant, j'utilise Java.Comment supprimer une balise HTML dans Java

+2

taper votre titre dans la zone de recherche, je suis arrivé ce qui suit: http://stackoverflow.com/search?q=How+to+remove+HTML+tag + in + Java ... n'avez-vous pas eu la même chose pendant que vous posiez la question? – kdgregory

+2

Je n'ai trouvé aucun doublon. Ces questions concernent l'extraction de texte à partir de HTML: http://stackoverflow.com/questions/240546/removing-html-from-a-java-string http: // stackoverflow.com/questions/832620/stripping-html-tags-in-java – tangens

Répondre

20

Vous devez utiliser un analyseur HTML à la place. J'aime htmlCleaner, car il me donne une jolie version imprimée du HTML.

Avec htmlCleaner vous pouvez faire:

TagNode root = htmlCleaner.clean(stream); 
Object[] found = root.evaluateXPath("//div[id='something']"); 
if(found.length > 0 && found instanceof TagNode) { 
    ((TagNode)found[0]).removeFromTree(); 
} 
+0

Merci de m'avoir indiqué htmlCleaner :) – exhuma

+0

Avons-nous besoin d'une bibliothèque pour utiliser ce code? Et root.evaluateXPath ("// div [id = 'quelquechose']"); dans ce "quelque chose" pourrait être n'importe quel id rite? s'il vous plaît, faites-moi savoir. merci –

4

No. Les expressions régulières ne peuvent pas par définition Parse HTML.

Vous pouvez utiliser une regex à s/<[^>]*\>// ou quelque chose de naïf comme ça mais ce sera insuffisant, surtout si vous êtes intéressé par la suppression du contenu des tags.

Comme le dit une autre affiche, utilisez un analyseur HTML réel.

4

Si vous avez juste besoin de supprimer les balises, vous pouvez utiliser cette expression régulière:

content = content.replaceAll("<[^>]+>", ""); 

Il va supprimer les balises uniquement, mais pas d'autres choses HTML. Pour les choses plus complexes, vous devriez utiliser l'analyseur.

EDIT: Pour éviter les problèmes avec les commentaires HTML, vous pouvez effectuer les opérations suivantes:

content = content.replaceAll("<!--.*?-->", "").replaceAll("<[^>]+>", ""); 
+0

Puisque vous n'utilisez aucun des caractères de viande '.','^'et' $ ', les drapeaux' s'- et 'm' peuvent être omis. –

+0

Cette regex est susceptible de provoquer des altérations si le code HTML contient des commentaires XML avec des caractères "<' or '>" incorporés. –

0

Par ailleurs, si votre intention est de affichage au client entrée contrôlée par l'utilisateur, vous pouvez également il suffit de remplacer tous < par &lt; et tous > par &gt;. De cette façon, le HTML ne sera pas interprété tel quel par l'application du client (le webbrowser).

Si vous utilisez JSP en tant que technologie d'affichage, vous pouvez utiliser le c:out de JSTL pour cela. Il va échapper toutes les entités HTML par défaut. Par exemple,

<c:out value="<script>alert('XSS');</script>" /> 

n'affichera PAS l'alerte, mais montrera simplement la chaîne actuelle telle quelle.

0

vous pouvez utiliser ce code simple pour supprimer toutes les balises html ...

htmlString.replaceAll("\\<.*?\\>", "")) 
+1

Cela supprimera uniquement les balises d'ouverture et laissera les balises de fermeture non manipulées. – jlordo

+0

Je ne ferais jamais un travail comme ça par moi-même - l'analyse de HTML en texte brut est vraiment un job mec .. – jebbie

+0

Cela a fonctionné pour moi mais peut-être dépend de la complexité des balises, des commentaires, des scripts, etc. pour un cas complexe peut-être une bibliothèque html devrait être mieux. – jmoran

16

Il est JSoup qui est une bibliothèque java fait pour la manipulation HTML. Regardez la méthode clean() et l'objet WhiteList. Solution facile à utiliser!

+2

WOW, vous monsieur, vraiment fait ma journée, j'aime ça, OUI! Markdownj, Markdown4J, htmlCleaner .. tout d'eux est ***** désolé .. JSoup est le seul et unique où vous réalisez vraiment cela avec un one-liner: Chaîne plain = new HtmlToPlainText(). GetPlainText (Jsoup.parse (html)); – jebbie

+4

Un code plus court serait 'String texte en clair = Jsoup.parse (html) .text();' – jrarama

+2

@jrarama - Pas du tout. 'Jsoup.parse (html) .text()' supprime toutes les balises et les espaces, vous laissant seulement une longue ligne de texte, tandis que 'new HtmlToPlainText(). GetPlainText (Jsoup.parse (html))' formate le texte d'une manière simpliste, en gardant les sauts de ligne, les paragraphes, les puces, etc. – isapir

1

Vous n'avez besoin d'aucun analyseur HTML. Le code ci-dessous supprime tous les commentaires HTML:

htmlString = htmlString.replaceAll("(?s)<!--.*?-->", "");

Questions connexes