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