74 votes

Objective C HTML évasion/unescape

Je me demandais si il y a un moyen facile de faire un simple HTML évasion/unescape en Objective C. Ce que je veux, c’est quelque chose comme ce pseudo code :

Qui retourne

Unescaping j’espère que toutes les autres entités HTML aussi bien et même des codes ASCII comme Ӓ et autres.

Est-il des méthodes en Cocoa Touch/UIKit de faire cela ?

90voto

Michael Waterfall Points 10490

Découvrez ma catégorie NSString pour XMLEntities. Il y a des méthodes pour décoder les entités XML (y compris toutes les références de caractères HTML), coder les entités XML, décapage des balises et retirant les retours à la ligne et les espaces d’une chaîne :

35voto

Nikita Rybak Points 36641

Un autre HTML NSString catégorie de Google boîte à outils pour Mac
Malgré son nom, cette application fonctionne sur iOS aussi.

http://google-toolbox-for-mac.googlecode.com/svn/trunk/Foundation/GTMNSString+HTML.h

/// Get a string where internal characters that are escaped for HTML are unescaped 
//
///  For example, '&' becomes '&'
///  Handles   and 2 cases as well
///
//  Returns:
//    Autoreleased NSString
//
- (NSString *)gtm_stringByUnescapingFromHTML;

Et j'ai dû inclure seulement les trois fichiers dans le projet: en-tête, la mise en œuvre et de l' GTMDefines.h.

30voto

Andrew Grant Points 35305

Ce lien contient la solution ci-dessous. CF de cacao a la fonction CFXMLCreateStringByUnescapingEntities, mais ce n’est pas disponible sur l’iPhone.

29voto

Andrew Kozlik Points 506

Il s’agit d’une solution d’ensemble incroyablement piratée que je l’ai fait, mais si vous voulez simplement échapper une chaîne sans se soucier de l’analyse, procédez comme suit :

Je sais que ce n’est pas élégant, mais il fait le travail. Vous pouvez ensuite décoder un élément en appelant :

Comme je disais, c’est hacky mais il fonctionne. Si vous voulez encoder une chaîne, simplement inverser les paramètres stringByReplacingOccurencesOfString.

11voto

orj Points 4480

Dans iOS 7, vous pouvez utiliser NSAttributedString la possibilité d'importer HTML pour convertir en entités HTML à un NSString.

Par exemple:

@interface NSAttributedString (HTML)
+ (instancetype)attributedStringWithHTMLString:(NSString *)htmlString;
@end

@implementation NSAttributedString (HTML)
+ (instancetype)attributedStringWithHTMLString:(NSString *)htmlString
{
    NSDictionary *options = @{ NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,
                               NSCharacterEncodingDocumentAttribute :@(NSUTF8StringEncoding) };

    NSData *data = [htmlString dataUsingEncoding:NSUTF8StringEncoding];

    return [[NSAttributedString alloc] initWithData:data options:options documentAttributes:nil error:nil];
}

@end

Ensuite, dans votre code lorsque vous voulez nettoyer les entités:

NSString *cleanString = [[NSAttributedString attributedStringWithHTMLString:question.title] string];

C'est probablement la façon la plus simple, mais je ne sais pas comment performant, il est. Vous devriez probablement être sacrément sûr que le contenu de votre "nettoyage" ne contient pas d' <img> tags ou des trucs comme ça parce que cette méthode permettra de télécharger ces images lors de l'HTML à NSAttributedString de conversion. :)

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