Convertir HTML en texte simple dans Swift

je travaille sur une application de lecteur RSS simple comme un projet débutant dans Xcode. Je l'ai actuellement mis en place qu'il analyse le flux, et place le titre, la date de publication, la description et le contenu et l'affiche dans un WebView.

j'ai récemment décidé d'afficher la description (ou une version tronquée du contenu) dans le TableView utilisé pour sélectionner un message. Toutefois, lorsqu'il le fait:

cell.textLabel?.text = item.title?.uppercaseString
cell.detailTextLabel?.text = item.itemDescription //.itemDescription is a String

Il montre le HTML brut de la poste.

je voudrais savoir comment convertir le HTML en texte simple pour juste L'UILabel détaillé de TableView.

Merci!

50
demandé sur Martin R 2015-01-24 12:36:30

6 réponses

vous pouvez ajouter cette extension pour convertir votre code html en chaîne de caractères:

modifier / mettre à jour:

Discussion l'importateur HTML ne doit pas être appelé d'un contexte thread (c'est-à-dire, le dictionnaire d'options inclut documentType avec un la valeur html). Il va essayer de se synchroniser avec le thread principal, fail, et le temps. L'appeler à partir du fil principal fonctionne (mais peut encore si le HTML contient des références à des ressources externes qui devrait être évitée à tous les frais). Le mécanisme D'importation HTML est destiné pour implémenter quelque chose comme markdown (c'est-à-dire les styles de texte), les couleurs, etc), et non pas général d'importation HTML.

Xcode 9 * Swift 4

extension Data {
    var html2AttributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            print("error:", error)
            return  nil
        }
    }
    var html2String: String {
        return html2AttributedString?.string ?? ""
    }
}

extension String {
    var html2AttributedString: NSAttributedString? {
        return Data(utf8).html2AttributedString
    }
    var html2String: String {
        return html2AttributedString?.string ?? ""
    }
}

Xcode 8.3 • Swift 3.1

extension String {
    var html2AttributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: Data(utf8), options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            print("error:", error)
            return nil
        }
    }
    var html2String: String {
        return html2AttributedString?.string ?? ""
    }
}

cell.detailTextLabel?.text = item.itemDescription.html2String
176
répondu Leo Dabus 2018-08-29 01:39:16

voici ma réponse suggérée. Au lieu de l'extension, si vous voulez mettre la fonction à l'intérieur.

func decodeString(encodedString:String) -> NSAttributedString?
    {
        let encodedData = encodedString.dataUsingEncoding(NSUTF8StringEncoding)!
        do {
            return try NSAttributedString(data: encodedData, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding], documentAttributes: nil)
        } catch let error as NSError {
            print(error.localizedDescription)
            return nil
        }
    }

et appeler cette fonction et lancer NSAttributedString à String

let attributedString = self.decodeString(encodedString)
let message = attributedString.string
2
répondu Danboz 2016-01-26 06:19:50

s'il vous Plaît tester avec ce code pour le detailTextLabel:

var attrStr = NSAttributedString(
        data: item.itemDescription.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true),
        options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)
cell.detailTextLabel?.text = attrStr
1
répondu Altimir Antonov 2015-01-25 00:41:35

essayez cette solution dans swift3

extension String{
    func convertHtml() -> NSAttributedString{
        guard let data = data(using: .utf8) else { return NSAttributedString() }
        do{
            return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        }catch{
            return NSAttributedString()
        }
    }
}

pour utiliser

self.lblValDesc.attributedText = str_postdescription.convertHtml()
1
répondu Hardik Thakkar 2017-11-22 15:10:49

j'ai utilisé la réponse de Danboz, Je l'ai seulement changée pour retourner une chaîne simple (pas une chaîne de texte riche):

static func htmlToText(encodedString:String) -> String?
{
    let encodedData = encodedString.dataUsingEncoding(NSUTF8StringEncoding)!
    do
    {
        return try NSAttributedString(data: encodedData, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding], documentAttributes: nil).string
    } catch let error as NSError {
        print(error.localizedDescription)
        return nil
    }
}

pour moi, ça marche comme un charme, merci Danboz

0
répondu Shaybc 2016-04-09 23:47:48
//Swift 4, Xcode 9

extension String {

    var utfData: Data? {
        return self.data(using: .utf8)
    }

    var attributedHtmlString: NSAttributedString? {
        guard let data = self.utfData else {
            return nil
        }
        do {
            return try NSAttributedString(data: data,
           options: [
                     .documentType: NSAttributedString.DocumentType.html,
                     .characterEncoding: String.Encoding.utf8.rawValue
                    ], documentAttributes: nil)
        } catch {
            print(error.localizedDescription)
            return nil
        }
    }
}

extension UITextView {
   func setHtmlText(_ html: String) {
      if let attributedText = html.attributedHtmlString {
         self.attributedText = attributedText
      }
   }
}
0
répondu Suhit Patil 2017-09-12 12:41:00