はじめに
APIなどを介して取得した< ⇒ <
や& ⇒ &
のようなHTMLのエンティティ参照(Entity References)を含むStringを普通の文字列にデコードする必要があったため調べたところ,IBM-Swift/swift-html-entitiesやalexaubry/HTMLStringなどのオープンソースライブラリを見つけた.しかし,本当にこんなに大掛かりな仕掛けが必要なのか疑問に思った.そこで,例のごとくStack Overflowを漁ったところ,NSAttributeString
を使って一旦WebKit
を噛ませればいい感じになるというのを見つけた.見つけたソースをExtension化して使いやすくしたものを備忘録しておく.
ソース
extension String {
var htmlDecoded: String {
guard let data = self.data(using: .utf8) else {
return self
}
let options: [NSAttributedString.DocumentReadingOptionKey : Any] = [
.documentType : NSAttributedString.DocumentType.html,
.characterEncoding : String.Encoding.utf8.rawValue
]
guard let attrStr = try? NSAttributedString(data: data, options: options, documentAttributes: nil) else {
return self
}
return attrStr.string
}
}
let test = "<&>"
Swift.print(test.htmlDecoded) // ⇒ <&>