web-dev-qa-db-fra.com

Convertir du HTML en texte brut dans Swift

Je travaille sur une application de lecteur RSS simple en tant que projet débutant dans Xcode. Je l’ai actuellement configuré pour analyser le flux, placer le titre, la date de publication, la description et le contenu, puis l’afficher dans une vue Web.

J'ai récemment décidé d'afficher la description (ou une version tronquée du contenu) dans la vue de tableau utilisée pour sélectionner une publication. Cependant, ce faisant:

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

Il montre le code HTML brut de la publication.

Je voudrais savoir comment convertir le code HTML en texte brut pour le UILabel détaillé de TableView.

Merci!

54
Zaid Syed

Vous pouvez ajouter cette extension pour convertir votre code HTML en chaîne normale:

éditer/mettre à jour:

Discussion L'importateur HTML ne doit pas être appelé depuis un arrière-plan thread (c’est-à-dire que le dictionnaire d’options inclut documentType avec une valeur de html). Il essaiera de se synchroniser avec le thread principal, échouera, et temps mort. L'appeler depuis le thread principal fonctionne (mais peut toujours Expirer si le HTML contient des références à des ressources externes, ce qui devrait être évité à tout prix). 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.), pas pour l'importation HTML en général.

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
193
Leo Dabus

Swift 4, Xcode 9

extension String {

    var utfData: Data {
        return Data(utf8)
    }

    var attributedHtmlString: NSAttributedString? {

        do {
            return try NSAttributedString(data: utfData,
            options: [
                      .documentType: NSAttributedString.DocumentType.html,
                      .characterEncoding: String.Encoding.utf8.rawValue
                     ], documentAttributes: nil)
        } catch {
            print("Error:", error)
            return nil
        }
    }
}

extension UILabel {
   func setAttributedHtmlText(_ html: String) {
      if let attributedText = html.attributedHtmlString {
         self.attributedText = attributedText
      } 
   }
}
2
Suhit Patil

Voici ma réponse suggérée. Au lieu d'une extension, si vous voulez mettre la fonction dedans. 

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 appelez cette fonction et convertissez NSAttributedString en chaîne.

let attributedString = self.decodeString(encodedString)
let message = attributedString.string
2
Danboz

Veuillez 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
Altimir Antonov

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()
        }
    }
}

Utiliser  

self.lblValDesc.attributedText = str_postdescription.convertHtml()
1
Hardik Thakkar

Swift4.0 Extension

 extension String {
    var html2AttributedString: String? {
    guard let data = data(using: .utf8) else { return nil }
    do {
        return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil).string

    } catch let error as NSError {
        print(error.localizedDescription)
        return  nil
    }
  }
}
0
Maulik Patel

j'ai utilisé Danboz answer, je l'ai seulement modifié pour renvoyer une chaîne simple (et non 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
Shaybc
let content = givenString // html included string
let attrStr = try! NSAttributedString(data: content.data(using: String.Encoding.unicode, allowLossyConversion: true)!,options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],documentAttributes: nil)
self.labelName.attributedText = attrStr    
0
shahana mh