在Swift中将HTML转换为纯文本
我正在做一个简单的RSS阅读器应用程序作为Xcode的初学者项目。 我现在已经build立了它分析饲料,并放置标题,发布date,描述和内容,并显示在一个WebView。
我最近决定在用于selectpost的TableView中显示描述(或内容的截断版本)。 但是,这样做时:
cell.textLabel?.text = item.title?.uppercaseString cell.detailTextLabel?.text = item.itemDescription //.itemDescription is a String
它显示post的原始HTML。
我想知道如何将HTML转换为纯文本的只是TableView的详细UILabel。
谢谢!
您可以添加此扩展名将您的html代码转换为一个常规string:
编辑/更新:
Xcode 9 beta•Swift 4
extension String { var html2AttributedString: NSAttributedString? { do { return try NSAttributedString(data: Data(utf8), options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil) } catch { print("error:", error) return nil } } 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
这是我build议的答案。 而不是扩展,如果你想把里面的function。
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 } }
并调用该函数并将NSAttributedString强制转换为String
let attributedString = self.decodeString(encodedString) let message = attributedString.string
请使用以下代码testingdetailTextLabel:
var attrStr = NSAttributedString( data: item.itemDescription.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true), options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil, error: nil) cell.detailTextLabel?.text = attrStr
我已经使用Danboz的答案,只改变它返回一个简单的string(不是一个丰富的文本string):
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 } }
对我来说,它像一个魅力,感谢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 } } }