Подтвердить что ты не робот

Преобразование HTML в обычный текст в Swift

Я работаю над простым приложением RSS Reader в качестве начинающего проекта в Xcode. В настоящее время я настроил его, чтобы он разбирал фид и помещал заголовок, дату, описание и содержимое папок и отображал его в WebView.

Недавно я решил показать описание (или усеченную версию содержимого) в TableView, используемом для выбора сообщения. Однако при этом:

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

Он показывает исходный HTML-сообщение.

Я хотел бы знать, как преобразовать HTML в обычный текст только для подробного UILabel TableView.

Спасибо!

4b9b3361

Ответ 1

Вы можете добавить это расширение, чтобы преобразовать ваш HTML-код в обычную строку:

редактировать/обновление:

Обсуждение Импортер HTML не должен вызываться из фонового потока (то есть словарь опций включает documentType со значением html). Он попытается синхронизироваться с основным потоком, потерпит неудачу и истечет время ожидания. Вызов его из основного потока работает (но все равно может истечь время ожидания, если HTML содержит ссылки на внешние ресурсы, чего следует избегать любой ценой). Механизм импорта HTML предназначен для реализации чего-то вроде разметки (то есть стилей текста, цветов и т.д.), А не для общего импорта 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

Ответ 2

Вот мой предложенный ответ. Вместо расширения, если вы хотите поместить внутри функции.

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

Ответ 3

//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
      }
   }
}

Ответ 4

Проконсультируйтесь с этим кодом для detailTextLabel:

var attrStr = NSAttributedString(
        data: item.itemDescription.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true),
        options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)
cell.detailTextLabel?.text = attrStr

Ответ 5

Попробуйте это решение в 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()
        }
    }
}

Использовать

self.lblValDesc.attributedText = str_postdescription.convertHtml()

Ответ 6

Я использовал ответ Danboz, только изменил его, чтобы вернуть простую строку (не богатую текстовую строку):

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

Ответ 7

Добавить расширение в верхней части кода, (Это расширение будет конвертировать HTML в обычный текст)

Xcode 10.1 • 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 ?? ""
    }
}

Используйте везде, где вы want-

var HtmlData = "<html> <b>Hello this is bold HTML Data with tags </b> </html>"
var plainText = HtmlData.html2String

cell.descriptionLabel.text = plainText

Ответ 8

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