Il existe plusieurs façons de supprimer HTML tags
un fichier NSString
in Cocoa
.
Une façon est de rendre la chaîne dans un NSAttributedString
, puis de récupérer le texte rendu.
Une autre façon est d'utiliser NSXMLDocument's
- objectByApplyingXSLTString
method pour appliquer une XSLT
transformation qui le fait.
Malheureusement, l'iPhone ne prend pas en charge NSAttributedString
ou NSXMLDocument
. Il y a trop de cas de bord et de HTML
documents mal formés pour que je me sente à l'aise avec l'utilisation de regex ou NSScanner
. Quelqu'un a-t-il une solution à cela?
Une suggestion a été de rechercher simplement les caractères d'ouverture et de fermeture des balises, cette méthode ne fonctionnera pas sauf dans des cas très triviaux.
Par exemple, ces cas (du chapitre Perl Cookbook sur le même sujet) casseraient cette méthode:
<IMG SRC = "foo.gif" ALT = "A > B">
<!-- <A comment> -->
<script>if (a<b && a>c)</script>
<![INCLUDE CDATA [ >>>>>>>>>>>> ]]>
la source
Réponses:
Une solution rapide et "sale" (supprime tout entre <et>), fonctionne avec iOS> = 3.2:
Je l'ai déclaré comme catégorie os NSString.
la source
Cette
NSString
catégorie utiliseNSXMLParser
pour supprimer avec précision toutes lesHTML
balises d'unNSString
. Ceci est un seul.m
et.h
fichier qui peut être inclus dans votre projet facilement.https://gist.github.com/leighmcculloch/1202238
Vous vous déshabillez ensuite
html
en procédant comme suit:Importez l'en-tête:
Et puis appelez stripHtml:
Cela fonctionne également avec malformé
HTML
qui ne l'est pas techniquementXML
.la source
fonctionne bien pour moi
la source
Vous pouvez utiliser comme ci-dessous
la source
utilisez ceci
n'oubliez pas de l'inclure dans votre code: #import "RegexKitLite.h" voici le lien pour télécharger cette API: http://regexkit.sourceforge.net/#Downloads
la source
Jetez un œil à NSXMLParser. C'est un analyseur de type SAX. Vous devriez pouvoir l'utiliser pour détecter les balises ou autres éléments indésirables dans le document XML et les ignorer, en capturant uniquement du texte pur.
la source
Voici une solution plus efficace que la réponse acceptée:
La
NSString
catégorie ci-dessus utilise une expression régulière pour trouver toutes les balises correspondantes, fait une copie de la chaîne d'origine et finalement supprime toutes les balises en place en les itérant dans l'ordre inverse. C'est plus efficace car:Cela a fonctionné assez bien pour moi, mais une solution utilisant
NSScanner
pourrait être plus efficace.Comme la réponse acceptée, cette solution ne répond pas à tous les cas de frontière demandés par @lfalin. Celles-ci nécessiteraient une analyse beaucoup plus coûteuse dont le cas d'utilisation moyen n'a probablement pas besoin.
la source
Sans boucle (du moins de notre côté):
la source
la source
la source
J'ai étendu la réponse par m.kocikowski et essayé de la rendre un peu plus efficace en utilisant un NSMutableString. Je l'ai également structuré pour une utilisation dans une classe Utils statique (je sais qu'une catégorie est probablement la meilleure conception cependant), et j'ai supprimé la version automatique pour qu'elle se compile dans un projet ARC.
Inclus ici au cas où quelqu'un le trouverait utile.
.h
.m
la source
<(?>/?)(?!a).+?>
ceci supprimera toutes les balises à l'exception des balises d'ouverture <a> et de fermeture </a>.Si vous souhaitez obtenir le contenu sans les balises html de la page Web (document HTML), utilisez ce code dans la méthode
UIWebViewDidfinishLoading
déléguée .la source
J'imagine que le moyen le plus sûr serait simplement d'analyser les <> s, non? Faites une boucle sur toute la chaîne et copiez tout ce qui n'est pas compris entre <> s dans une nouvelle chaîne.
la source
Il s'agit de la modernisation de la réponse m.kocikowski qui supprime les espaces:
la source
Voici la réponse acceptée, mais au lieu de la catégorie, il s'agit d'une méthode d'assistance simple avec une chaîne passée. (merci m.kocikowski)
la source
Voici la version rapide:
la source
stringByReplacingOccurrencesOfString
u utiliser en dehors du cycle est un encodage en pourcentage et doit être corrigé de manière correcte.Si vous souhaitez utiliser le framework Three20 , il a une catégorie sur NSString qui ajoute la méthode stringByRemovingHTMLTags. Voir NSStringAdditions.h dans le sous-projet Three20Core.
la source
Étendre davantage cela à partir des réponses de m.kocikowski et Dan J avec plus d'explications pour les débutants
1 # Vous devez d'abord créer des catégories objective-c pour rendre le code utilisable dans n'importe quelle classe.
.h
.m
2 # Ensuite, importez simplement le fichier .h de la classe de catégorie que vous venez de créer, par exemple
3 # Appel de la méthode.
le résultat est NSString dont je veux supprimer les balises.
la source
J'ai suivi la réponse acceptée de m.kocikowski et modifiée est légèrement d'utiliser un autoreleasepool pour nettoyer toutes les chaînes temporaires créées par stringByReplacingCharactersInRange
Dans le commentaire de cette méthode, il indique, / * Remplace les caractères de la plage par la chaîne spécifiée, en retournant une nouvelle chaîne. * /
Ainsi, selon la longueur de votre XML, vous pouvez créer une énorme pile de nouvelles chaînes de libération automatique qui ne seront pas nettoyées avant la fin du prochain @autoreleasepool. Si vous ne savez pas quand cela peut se produire ou si une action de l'utilisateur pourrait déclencher à plusieurs reprises de nombreux appels à cette méthode auparavant, vous pouvez simplement conclure cela dans un @autoreleasepool. Ceux-ci peuvent même être imbriqués et utilisés dans des boucles lorsque cela est possible.
La référence d'Apple sur @autoreleasepool indique ceci ... "Si vous écrivez une boucle qui crée de nombreux objets temporaires. Vous pouvez utiliser un bloc de pool de libération automatique à l'intérieur de la boucle pour supprimer ces objets avant l'itération suivante. Utilisation d'un bloc de pool de libération automatique dans la boucle contribue à réduire l'empreinte mémoire maximale de l'application. " Je ne l'ai pas utilisé dans la boucle, mais au moins cette méthode nettoie après elle-même maintenant.
la source
Une autre façon:
Interface:
-(NSString *) stringByStrippingHTML:(NSString*)inputString;
la mise en oeuvre
La concrétisation
cell.exampleClass.text = [self stringByStrippingHTML:[exampleJSONParsingArray valueForKey: @"key"]];
ou simple
NSString *myClearStr = [self stringByStrippingHTML:rudeStr];
la source
Une réponse mise à jour pour @ m.kocikowski qui fonctionne sur les versions récentes d'iOS.
}
la source
Voici un article de blog qui traite de quelques bibliothèques disponibles pour le décapage HTML http://sugarmaplesoftware.com/25/strip-html-tags/ Notez les commentaires où d'autres solutions sont proposées.
la source