Existe-t-il un bon moyen de supprimer le HTML d'une chaîne Java? Un regex simple comme
replaceAll("\\<.*?>","")
fonctionnera, mais des choses comme &
ne seront pas converties correctement et le non-HTML entre les deux crochets sera supprimé (c'est- .*?
à- dire que dans l'expression régulière disparaîtra).
Réponses:
Utilisez un analyseur HTML au lieu de regex. C'est très simple avec Jsoup .
Jsoup prend également en charge la suppression des balises HTML par rapport à une liste blanche personnalisable, ce qui est très utile si vous souhaitez autoriser uniquement, par exemple
<b>
,<i>
et<u>
.Voir également:
la source
Jsoup#clean()
place.<p>Lorem ipsum 1 < 3 dolor sit amet</p>
. Encore une fois, HTML n'est pas un langage standard . Cela me dépasse complètement pourquoi tout le monde essaie de lancer des expressions rationnelles dessus pour analyser des parties d'intérêt au lieu d'utiliser un véritable analyseur.Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));
pour préserver les sauts de ligneSi vous écrivez pour Android, vous pouvez le faire ...
la source
Si l'utilisateur entre
<b>hey!</b>
, voulez-vous afficher<b>hey!</b>
ouhey!
? Si c'est le premier, échappez à less-thans et html-encode esperluette (et éventuellement des guillemets) et tout va bien. Une modification de votre code pour implémenter la deuxième option serait:mais vous rencontrerez des problèmes si l'utilisateur entre quelque chose de malformé, comme
<bhey!</b>
.Vous pouvez également consulter JTidy qui analysera les entrées html «sales» et devrait vous donner un moyen de supprimer les balises tout en conservant le texte.
Le problème avec la suppression du code HTML est que les navigateurs ont des analyseurs très cléments, plus clément que n'importe quelle bibliothèque que vous pouvez trouver, donc même si vous faites de votre mieux pour supprimer toutes les balises (en utilisant la méthode replace ci-dessus, une bibliothèque DOM ou JTidy) , vous devrez toujours vous assurer d'encoder tous les caractères spéciaux HTML restants pour garantir la sécurité de votre sortie.
la source
Une autre façon consiste à utiliser javax.swing.text.html.HTMLEditorKit pour extraire le texte.
ref: Supprimer les balises HTML d'un fichier pour extraire uniquement le TEXTE
la source
Je pense que la façon la plus simple de filtrer les balises html est:
la source
Aussi très simple avec Jericho , et vous pouvez conserver une partie de la mise en forme (sauts de ligne et liens, par exemple).
la source
La réponse acceptée de faire a simplement
Jsoup.parse(html).text()
2 problèmes potentiels (avec JSoup 1.7.3):<script>
en<script>
Si vous l'utilisez pour vous protéger contre XSS, c'est un peu ennuyeux. Voici ma meilleure image d'une solution améliorée, utilisant à la fois JSoup et Apache StringEscapeUtils:
Notez que la dernière étape est parce que je dois utiliser la sortie en texte brut. Si vous n'avez besoin que d'une sortie HTML, vous devriez pouvoir la supprimer.
Et voici un tas de cas de test (entrée à sortie):
Si vous trouvez un moyen de l'améliorer, faites-le moi savoir.
la source
&lt;script&gt;alert('Evil script executed');&lt;/script&gt;
. Il en va de même&
. JSoup ne convertit pas<script> into <script>
, il le fait parce que vous appelezStringEscapeUtils.unescapeHtml
après que JSoup ait nettoyé l'entrée.Sur Android, essayez ceci:
la source
L'échappement HTML est vraiment difficile à faire correctement - je suggérerais certainement d'utiliser le code de bibliothèque pour ce faire, car c'est beaucoup plus subtil que vous ne le pensez. Consultez StringEscapeUtils d' Apache pour une assez bonne bibliothèque pour gérer cela en Java.
la source
Cela devrait fonctionner -
utilisez ceci
et ça
la source
Vous voudrez peut-être remplacer
<br/>
et</p>
des étiquettes avec des sauts de ligne avant de se dénuder le code HTML pour l' empêcher de devenir un gâchis illisible comme le suggère Tim.La seule façon dont je peux penser à supprimer des balises HTML, mais de laisser du non-HTML entre les crochets angulaires serait de comparer avec une liste de balises HTML . Quelque chose dans ce sens ...
Décodez ensuite des caractères spéciaux tels que HTML
&
. Le résultat ne doit pas être considéré comme désinfecté.la source
Alternativement, on peut utiliser HtmlCleaner :
la source
La réponse acceptée n'a pas fonctionné pour moi pour le cas de test que j'ai indiqué: le résultat de "a <b ou b> c" est "ab ou b> c".
J'ai donc utilisé TagSoup à la place. Voici une photo qui a fonctionné pour mon cas de test (et quelques autres):
la source
Je sais que c'est vieux, mais je travaillais juste sur un projet qui m'obligeait à filtrer le HTML et cela a bien fonctionné:
au lieu de cela:
la source
Voici une mise à jour légèrement plus étoffée pour essayer de gérer la mise en forme des pauses et des listes. J'ai utilisé la sortie d'Amaya comme guide.
la source
Utilisation
Html.fromHtml
Les balises HTML sont
Selon les documentations officielles d'Android, toutes les balises dans le HTML s'afficheront comme une chaîne de remplacement générique que votre programme peut ensuite parcourir et remplacer par de vraies chaînes .
Html.formHtml
prend unHtml.TagHandler
et un Html.ImageGetter comme arguments ainsi que le texte à analyser.Exemple
alors
Production
Il s'agit du texte que l'utilisateur peut mettre dans son profil
la source
Voici une autre variante de la façon de tout remplacer (balises HTML | Entités HTML | Espace vide dans le contenu HTML)
content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", "");
où le contenu est une chaîne.la source
Vous pouvez simplement utiliser le filtre HTML par défaut d'Android
La méthode ci-dessus renverra la chaîne filtrée HTML pour votre entrée.
la source
Une autre façon peut être d'utiliser la classe com.google.gdata.util.common.html.HtmlToText comme
Ce n'est cependant pas un code à l'épreuve des balles et lorsque je l'exécute sur des entrées wikipedia, j'obtiens également des informations de style. Cependant, je crois que pour les petits travaux / simples, ce serait efficace.
la source
Il semble que vous souhaitiez passer du HTML au texte brut.
Si tel est le cas, consultez www.htmlparser.org. Voici un exemple qui supprime toutes les balises du fichier html trouvé sur une URL.
Il utilise org.htmlparser.beans.StringBean .
la source
Voici une autre façon de procéder:
la source
On pourrait également utiliser Apache Tika à cet effet. Par défaut, il préserve les espaces blancs du HTML supprimé, ce qui peut être souhaité dans certaines situations:
la source
Parse.parse(InputStream, ContentHandler, Metadata, ParseContext)
.Une façon de conserver les informations de nouvelle ligne avec JSoup est de précéder toutes les nouvelles balises de ligne avec une chaîne factice, d'exécuter JSoup et de remplacer la chaîne factice par "\ n".
la source
la source
Mes 5 cents:
la source
Pour obtenir du texte html brut formaté, vous pouvez le faire:
Pour obtenir du texte formaté, modifiez <br/> par \ n et modifiez la dernière ligne par:
la source
Je sais que cela fait un moment que cette question n'a pas été posée, mais j'ai trouvé une autre solution, c'est ce qui a fonctionné pour moi:
la source
vous pouvez simplement créer une méthode avec multiple replaceAll () comme
Utilisez ce lien pour les remplacements les plus courants dont vous avez besoin: http://tunes.org/wiki/html_20special_20characters_20and_20symbols.html
C'est simple mais efficace. J'utilise d'abord cette méthode pour supprimer les fichiers indésirables, mais pas la toute première ligne, c'est-à-dire replaceAll ("\ <. *?>", ""), Puis j'utilise des mots clés spécifiques pour rechercher des index, puis j'utilise .substring (start, end ) méthode pour éliminer les éléments inutiles. Comme c'est plus robuste et vous pouvez identifier exactement ce dont vous avez besoin dans toute la page html.
la source
Supprimez les balises HTML de la chaîne. Quelque part, nous devons analyser une chaîne qui est reçue par certaines réponses comme Httpresponse du serveur.
Nous devons donc l'analyser.
Ici, je vais montrer comment supprimer les balises html de la chaîne.
la source
new System.Text.RegularExpressions.Regex();
?