티스토리 뷰

반응형

 

 

문제 상황 이해하기

 

API를 통해서 문자열을 호출할 때 HTML 태그와 함께 오는 경우들이 있어요.

예를 들면, Kakao API에서 카페 검색 정보를 호출할 때 결과물 중 제목과 콘텐츠에 HTML 태그들이 섞여와요.

 

아래는 Kakao 개발 가이드에서 보여주는 Response의 예시에요.

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
  "meta": {
    "is_end": false,
    "pageable_count": 983,
    "total_count": 218662
  },
  "documents": [
    {
      "cafename": "쭉빵카페",
      "contents": "무대의상들 정보 궁금해하는 게녀들이 있길래 가져왔어! 이번에는 레드벨벳이랑 <b>아이유</b> 의상만 가져왔는데 기회가 되면 다음에 다른 연예인들 의상도 가져올게~ 링크가...",
      "datetime": "2017-01-31T16:57:33.000+09:00",
      "thumbnail": "https://search1.kakaocdn.net/thumb/P100x100/?fname=http%3A%2F%2Fsearch1.kakaocdn.net%2Fargon%2F130x130_85_c%2FFJtvuJLusO",
      "title": "연예인 무대의상 정보 가져왔어! (feat. 레드벨벳, <b>아이유</b>)",
      "url": "http://cafe.daum.net/ok1221/9fQk/39709"
    },
    ...
  ]
}

title에서 원하는 정보는 "feat. 레드벨벳, 아이유"인데 그대로 받아오면 "<b>아이유</b>"를 출력하게 돼요.

그래서 Swift에서 문자열 중 html만 제거하는 기능을 구현하는 방법을 볼게요 :]

 

 

기능 구현하기

// MARK: - Edit HTML String

extension String {
  
  // MARK: Initializers
  
  init?(htmlEncodedString: String) {
    guard let data = htmlEncodedString.data(using: .utf8) else { return nil }
    
    let options: [NSAttributedString.DocumentReadingOptionKey:Any] = [
      .documentType: NSAttributedString.DocumentType.html,
      .characterEncoding: String.Encoding.utf8.rawValue
    ]
    guard let attributedString = try? NSAttributedString(data: data, options: options, documentAttributes: nil) else {
      return nil
    }
    self.init(attributedString.string)
  }
}
반응형
댓글