44 votes

Suppression des balises HTML en Java

Existe-t-il une bibliothèque Java qui offre une méthode permettant de supprimer toutes les balises HTML d'une chaîne ? Je cherche quelque chose d'équivalent à la méthode strip_tags en PHP.

Je sais que je peux utiliser une expression rationnelle comme celle décrite dans le document suivant cette question Stackoverflow mais je me demandais s'il n'existait pas déjà une stripTags() flottant quelque part dans la bibliothèque Apache Commons qui peut être utilisée.

3 votes

En attendant, j'utilise le code suivant pour supprimer toutes les balises HTML de la chaîne : String strippedHtml = rawHtml.replaceAll("<(.| \n )*?>", "") ;

33voto

jebbie Points 462

Utilisez JSoup Elle est bien documentée, disponible sur Maven et après une journée passée à utiliser plusieurs bibliothèques, c'est pour moi la meilleure que je puisse imaginer. Mon opinion personnelle est qu'un travail comme celui-là, analyser le html en texte clair, devrait être possible en une seule ligne de code -> sinon la bibliothèque a échoué d'une manière ou d'une autre... je dis ça comme ça ^^ Donc voilà, le one-liner de JSoup - dans Markdown4J, quelque chose comme ça n'est pas possible, dans Markdownj aussi, dans htmlCleaner c'est une douleur dans le cul avec environ 50 lignes de code...

String plain = new HtmlToPlainText().getPlainText(Jsoup.parse(html));

Et ce que vous obtenez est du vrai texte brut (pas seulement le code source html sous forme de chaîne, comme dans d'autres librairies) -> il fait vraiment un excellent travail sur ce point. C'est plus ou moins la même qualité que Markdownify pour PHP.....

0 votes

Le problème avec Jsoup est qu'il supprime également les nouvelles lignes, de sorte que toutes les entrées analysées seront sur une seule ligne.

0 votes

Et que le résultat peut contenir des balises HTML si l'entrée contient "%gt;tag<" ou similaire.

0 votes

Ok Jules mais alors ce n'est pas un problème de JSoup est-ce que d'autres sont meilleurs dans ce domaine ? cela n'a pas d'importance parce que c'est toujours mieux pour moi de décoder simplement la chaîne html encodée en url avant de la donner à JSoup au lieu d'écrire plusieurs centaines de lignes de code pour réaliser ce que JSoup fait (si une autre librairie ici serait meilleure dans ce domaine particulier).

29voto

Jason Fritcher Points 1039

Quoi que vous fassiez, assurez-vous de normaliser les données avant d'essayer de dépouiller les étiquettes. J'ai récemment participé à un atelier sur la sécurité des applications Web qui traitait de l'évasion des filtres XSS. On pourrait normalement penser que la recherche de < o &lt; ou son équivalent hexagonal serait suffisant. J'ai été époustouflé après avoir vu une diapositive avec 70 façons de faire que < peuvent être codés pour battre les filtres.

Mise à jour :

Voici la présentation à laquelle je faisais référence, voir la diapositive 26 pour les 70 façons de coder. < .

Évasion de filtre : Houdini sur le fil

0 votes

Pourriez-vous ajouter un lien vers cette diapositive ? Je crois qu'il n'y a pas tant de méthodes d'encodage qui sont valables pour le navigateur...

0 votes

Corrigez-moi si je me trompe, mais le premier élément de cette liste n'est-il pas le seul qui sera réellement interprété par un navigateur comme commençant une balise HTML ? Les autres seront soit affichés tels quels, soit affichés comme un '<' littéral dans le document résultant, n'est-ce pas ? Dans ce cas, quel est l'intérêt de cette liste ?

29voto

tokam Points 1007

C'est ce que j'ai trouvé sur google à ce sujet. Pour moi, ça a bien marché.

String noHTMLString = htmlString.replaceAll("\\<.*?\\>", "");

3 votes

Cela ne va-t-il pas supprimer les balises non html comme <hello> ?

2 votes

Je ne crois pas qu'une petite expression comme celle-ci peut couvrent tous les cas du html... qu'en est-il du formatage spécial ? de bonnes bibliothèques comme JSoup prennent même soin du formatage lorsqu'elles génèrent du texte brut ( !)... je veux dire, la transformation, vous n'arriverez jamais à cela avec une regex seulement

1 votes

Je suggère d'ajouter des balises < > également. Chaîne noHTMLString = htmlString.replaceAll("( \\ <.* ? \\ >|<.*?>)", "") ; Au fait, il supprime les balises non html comme <hello>.

11voto

Charlie Martin Points 62306

Il y en a peut-être, mais le plus robuste est d'utiliser un véritable analyseur HTML. Il en existe un aquí et s'il est raisonnablement bien formé, vous pouvez également utiliser SAX ou un autre analyseur XML.

0 votes

Bien sûr, si ce que vous cherchez à obtenir à la fin est une chaîne qui est garantie sûre pour être incluse dans une sortie HTML, un analyseur HTML n'est pas ce que vous voulez, sinon la chaîne '<script>alert("hello");' passerait par l'analyseur et finirait par être dangereuse même si elle ne l'était pas au départ...

2 votes

Peut-être que si vous pouviez arrêter d'être condescendant, ce serait plus utile. Je suis assez familier avec les analyseurs HTML, et j'en ai utilisé beaucoup au cours des 20 dernières années. Typiquement, la sortie d'un analyseur HTML est un DOM ou quelque chose de similaire, mais la question demandait clairement une chaîne de caractères, donc je suppose que votre suggestion est d'utiliser la propriété DOM du W3C. textContent du DOM analysé résultant, ou un équivalent si vous utilisez un analyseur dont la sortie n'est pas un DOM. Si c'est ce que vous recommandez, c'est dangereux car cela permettra de passer le contenu HTML s'il est encodé dans le document source comme des entités.

0 votes

Peut-être. Peut-être pas. Mais si vous êtes si peu clair sur le concept de "parser", je ne parierais pas dessus.

11voto

Todd Points 1142

Après avoir laissé cette question ouverte pendant près d'une semaine, je peux affirmer avec certitude qu'il n'existe aucune méthode disponible dans l'API Java ou les librairies Apache permettant de supprimer les balises HTML d'une chaîne. Vous devez soit utiliser un analyseur HTML comme décrit dans les réponses précédentes, soit écrire une simple expression régulière pour supprimer les balises.

0 votes

Hum, qu'est-ce que vous pensez qui pourrait faire une telle chose, si ce n'est un analyseur HTML ? Ou, d'ailleurs, qu'imaginez-vous faire avec une expression régulière ?

0 votes

J'imagine que ce qu'il fait avec une expression régulière est la même chose que ce que je fais avec une expression régulière : supprimer tout ce qui, dans une chaîne, ressemble à une balise HTML afin de s'assurer que la chaîne résultante est à la fois (1) lisible par l'homme et (2) ne présente pas de vulnérabilité XSS si elle est intégrée dans une page Web.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X