Supprimer les balises HTML en Java

Existe-t-il une bibliothèque Java existante qui fournit une méthode pour supprimer toutes les balises HTML d’une chaîne? Je cherche quelque chose d’équivalent à la fonction ssortingp_tags en PHP.

Je sais que je peux utiliser une regex comme décrit dans cette question Stackoverflow , mais j’étais curieux de savoir s’il y avait déjà une méthode ssortingpTags() qui pouvait être utilisée quelque part dans la bibliothèque Apache Commons.

Utilisez JSoup , il est bien documenté, disponible sur Maven et après une journée de temps passé avec plusieurs bibliothèques, pour moi, c’est la meilleure que je puisse imaginer. text, devrait être possible sur une seule ligne de code – sinon la bibliothèque a échoué d’une façon ou d’une autre … simplement dire ^^ Donc, le one-liner de JSoup – dans Markdown4J, quelque chose comme ça n’est pas possible, aussi dans Markdownj , dans htmlCleaner c’est une douleur dans le cul avec environ 50 lignes de code …

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

Et ce que vous obtenez est du vrai texte brut (pas seulement le code-source html en tant que chaîne, comme dans les autres bibliothèques lol) – il fait vraiment du bon travail à ce sujet. C’est à peu près la même qualité que Markdownify pour PHP ….

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

 Ssortingng noHTMLSsortingng = htmlSsortingng.replaceAll("\\<.*?\\>", ""); 

Quoi que vous fassiez, assurez-vous de normaliser les données avant d’essayer de supprimer les balises. J’ai récemment assisté à un atelier sur la sécurité des applications Web consacré à l’évasion des filtres XSS. On penserait normalement que chercher < ou < ou son équivalent hexadécimal serait suffisant. J'ai été époustouflé après avoir vu une diapositive de 70 façons dont < peut être encodé pour battre les filtres.

Mettre à jour:

Vous trouverez ci-dessous la présentation à laquelle je fais référence, voir la diapositive 26 pour les 70 façons d'encoder < .

Evasion du filtre: Houdini sur le fil

Il y en a peut-être un peu, mais le plus robuste consiste à utiliser un parsingur HTML réel. Il y en a un ici , et s’il est raisonnablement bien formé, vous pouvez également utiliser SAX ou un autre parsingur XML.

Après avoir ouvert cette question pendant presque une semaine, je peux affirmer avec certitude qu’il n’ya pas de méthode disponible dans l’API Java ou dans les librairies Apache qui dépouille les balises HTML d’une chaîne. Vous devrez soit utiliser un parsingur HTML tel que décrit dans les réponses précédentes, soit écrire une expression régulière simple pour supprimer les balises.

J’ai utilisé le nekoHtml pour le faire. Il peut supprimer toutes les balises, mais il peut aussi facilement conserver ou supprimer un sous-ensemble de balises.

Lorsque vous utilisez Jsoup, c’est encore plus facile que décrit ci-dessus:

 Ssortingng html = "bla hehe 
this is awesome simple"; Ssortingng text = Jsoup.parse(html).text();

Je sais que cette question est assez ancienne, mais je l’ai également cherché et il semble que ce n’est pas toujours facile de trouver une solution simple et efficace en Java.

Aujourd’hui, je suis tombé sur ces petites fonctions lib. Il tente en fait d’imiter la fonction php ssortingp_tags .

http://jmelo.lyncode.com/java-ssortingp_tags-php-function/

Cela fonctionne comme ça (copié depuis leur site):

  import static com.lyncode.jtwig.functions.util.HtmlUtils.ssortingpTags; public class SsortingpTagsExample { public static void main(Ssortingng... args) { Ssortingng result = ssortingpTags("Test", ""); // Produced result: Test } } 

Salut, je sais que ce fil est vieux mais il est toujours sorti en tête sur Google, et je cherchais une solution rapide au même problème. Je n’ai rien trouvé d’utile alors j’ai trouvé cet extrait de code – j’espère que cela aidera quelqu’un. Il ne fait que boucler la chaîne et ignore toutes les balises. Simple et simple

 boolean intag = false; Ssortingng inp = "

Some HTML text"; Ssortingng outp = ""; for (int i=0; i < inp.length(); ++i) { if (!intag && inp.charAt(i) == '<') { intag = true; continue; } if (intag && inp.charAt(i) == '>') { intag = false; continue; } if (!intag) { outp = outp + inp.charAt(i); } } return outp;

Avec une approche itérative pure et sans regex:

 public Ssortingng ssortingpTags(final Ssortingng html) { final SsortingngBuilder sbText = new SsortingngBuilder(); final SsortingngBuilder sbHtml = new SsortingngBuilder(); boolean isText = true; for (char ch : html.toCharArray()) { if (isText) { // outside html if (ch != '<') { sbText.append(ch); continue; } else { // switch mode isText = false; sbHtml.append(ch); continue; } }else { // inside html if (ch != '>') { sbHtml.append(ch); continue; } else { // switch mode isText = true; sbHtml.append(ch); continue; } } } return sbText.toSsortingng(); } 

En raison de l’abréviation (chaîne de troncation) du fragment html, j’ai également eu le problème des balises HTML non fermées que regex ne peut pas détecter. Par exemple:

 Lorem ipsum dolor sit amet, consectetur adipiscing elit.  

Donc, en me référant aux 2 meilleures réponses (JSoup et regex), j'ai préféré la solution en utilisant JSoup:

 Jsoup.parse(html).text() 

Wicket utilise la méthode suivante pour échapper à HTML, situé dans: org.apache.wicket.util.ssortingng.Ssortingngs

 public static CharSequence escapeMarkup(final Ssortingng s, final boolean escapeSpaces, final boolean convertToHtmlUnicodeEscapes) { if (s == null) { return null; } else { int len = s.length(); final AppendingSsortingngBuffer buffer = new AppendingSsortingngBuffer((int)(len * 1.1)); for (int i = 0; i < len; i++) { final char c = s.charAt(i); switch (c) { case '\t' : if (escapeSpaces) { // Assumption is four space tabs (sorry, but that's // just how it is!) buffer.append("    "); } else { buffer.append(c); } break; case ' ' : if (escapeSpaces) { buffer.append(" "); } else { buffer.append(c); } break; case '<' : buffer.append("<"); break; case '>' : buffer.append(">"); break; case '&' : buffer.append("&"); break; case '"' : buffer.append("""); break; case '\'' : buffer.append("'"); break; default : if (convertToHtmlUnicodeEscapes) { int ci = 0xffff & c; if (ci < 160) { // nothing special only 7 Bit buffer.append(c); } else { // Not 7 Bit use the unicode system buffer.append("&#"); buffer.append(new Integer(ci).toString()); buffer.append(';'); } } else { buffer.append(c); } break; } } return buffer; } } 
 public static Ssortingng ssortingpTags(Ssortingng str) { int startPosition = str.indexOf('<'); int endPosition; while (startPosition != -1) { endPosition = str.indexOf('>', startPosition); str = str.subssortingng(0, startPosition) + (endPosition != -1 ? str.subssortingng(endPosition + 1) : ""); startPosition = str.indexOf('<'); } return str; }