문자열에서 HTML 태그 제거


97

깨끗한 텍스트를 출력 할 수 있도록 문자열에서 HTML 태그를 제거하려면 어떻게합니까?

let str = string.stringByReplacingOccurrencesOfString("<[^>]+>", withString: "", options: .RegularExpressionSearch, range: nil)
print(str)


1
주도적으로,이 질문은 많은 가치를 가지고 있지만, 당신이 명확한 질문을하지 않기 때문에 종결 될 가능성이 있습니다 : 재현 할 수없는 시나리오입니다. How to Ask에 따라 질문을 수정하는 것이 좋습니다 . 이 질문이 삭제되는 것을 원하지 않습니다.
Tunaki

3
롤 stackoverflow ... 어떻게 "오프 토픽"으로 닫혀 있습니까? "Swift remove html tags"에 대한 # 1 Google 결과입니다.
canhazbits

2
@canhazbits 맞아요! 다시 열려면 다시 열기를 클릭하여 지명하십시오.
주도 :

1
Swift 3 : string.replacingOccurrences (of : "<[^>] +>", with : "", 옵션 : .regularExpression, 범위 : nil)
etayluz

답변:


147

흠, 귀하의 기능을 시도해 보았고 작은 예에서 작동했습니다.

var string = "<!DOCTYPE html> <html> <body> <h1>My First Heading</h1> <p>My first paragraph.</p> </body> </html>"
let str = string.stringByReplacingOccurrencesOfString("<[^>]+>", withString: "", options: .RegularExpressionSearch, range: nil)
print(str)

//output "  My First Heading My first paragraph. "

문제의 예를 들어 줄 수 있습니까?

Swift 4 및 5 버전 :

var string = "<!DOCTYPE html> <html> <body> <h1>My First Heading</h1> <p>My first paragraph.</p> </body> </html>"
let str = string.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)

25
<LOL> Ha Ha! </ LOL>
Steve Rosenberg


1
예를 들어, 다음 HTML 조각을 시도해보십시오.<p foo=">now what?">Paragraph</p>
Paramagnetic Croissant

32
스위프트 3에서 string.replacingOccurrences(of: "<[^>]+>", with: "", options: String.CompareOptions.regularExpression, range: nil)
Husam

5
Swift 4에서 string.replacingOccurrences (of : "<[^>] +>", with : "", options : .regularExpression, range : nil)
Raegtime

29

HTML은 일반 언어 가 아니기 때문에 (HTML은 컨텍스트가없는 언어) 정규식을 사용할 수 없습니다. 참조 : 정규식을 사용하여 HTML 구문 분석 : 왜 안 되는가?

대신 NSAttributedString을 사용하는 것이 좋습니다.

let htmlString = "LCD Soundsystem was the musical project of producer <a href='http://www.last.fm/music/James+Murphy' class='bbcode_artist'>James Murphy</a>, co-founder of <a href='http://www.last.fm/tag/dance-punk' class='bbcode_tag' rel='tag'>dance-punk</a> label <a href='http://www.last.fm/label/DFA' class='bbcode_label'>DFA</a> Records. Formed in 2001 in New York City, New York, United States, the music of LCD Soundsystem can also be described as a mix of <a href='http://www.last.fm/tag/alternative%20dance' class='bbcode_tag' rel='tag'>alternative dance</a> and <a href='http://www.last.fm/tag/post%20punk' class='bbcode_tag' rel='tag'>post punk</a>, along with elements of <a href='http://www.last.fm/tag/disco' class='bbcode_tag' rel='tag'>disco</a> and other styles. <br />"    
let htmlStringData = htmlString.dataUsingEncoding(NSUTF8StringEncoding)!
let options: [String: AnyObject] = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding]
let attributedHTMLString = try! NSAttributedString(data: htmlStringData, options: options, documentAttributes: nil)
let string = attributedHTMLString.string

또는 코멘트의 Irshad Mohamed가 그렇게 할 것입니다.

let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
print(attributed.string)

7
이것은 가장 깨끗한 접근 방식으로 보이며 훌륭하게 잘 작동합니다! 비정상적인 파서를 직접 작성하는 대신 전투 테스트를 거친 Foundation 프레임 워크가이를 처리하도록하는 것이 가장 좋습니다.
Shyam Bhat 2016

4
깨끗한!! let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)대부분의 사람들은 작고 이해하기 쉬운 답변을 선호합니다.
Irshad Mohamed

1
솔루션에 감사드립니다! html 태그를 제거하는 동안 공백과 줄 바꿈을 저장할 수 있습니까? 현재 모든 줄 바꿈은 새 문자열에서 무시됩니다.
Astha 굽타

7
이것을 사용하는 경고 : HTML 스타일 변환 (속성)이 느립니다! . WWDC의 CoreText 엔지니어는 이것이 더 이상 유지되지 않으며 완전히 잊었다 고 말했습니다.
사이렌

1
이전 경고에 대한 경고 : 너무 "느린"방법을 버리기 전에 일부 데이터를 살펴 보겠습니다. 많은 유지 관리가 필요하지 않은 (종종 깨닫지 못한 채로) 사용하는 C 라이브러리가 많이 있습니다. 그것은 반드시 나쁜 것은 아닙니다.
Joony

11

Mohamed 솔루션이지만 Swift 4의 문자열 확장입니다.

extension String {

    func stripOutHtml() -> String? {
        do {
            guard let data = self.data(using: .unicode) else {
                return nil
            }
            let attributed = try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
            return attributed.string
        } catch {
            return nil
        }
    }
}

8

특정 HTML 요소를 제거하기 위해 다음 확장을 사용하고 있습니다.

extension String {
    func deleteHTMLTag(tag:String) -> String {
        return self.stringByReplacingOccurrencesOfString("(?i)</?\(tag)\\b[^<]*>", withString: "", options: .RegularExpressionSearch, range: nil)
    }

    func deleteHTMLTags(tags:[String]) -> String {
        var mutableString = self
        for tag in tags {
            mutableString = mutableString.deleteHTMLTag(tag)
        }
        return mutableString
    }
}

이렇게하면 <a>문자열에서 태그 만 제거 할 수 있습니다 . 예 :

let string = "my html <a href="">link text</a>"
let withoutHTMLString = string.deleteHTMLTag("a") // Will be "my  html link text"

@Mr Lister는 모든 html 태그를 제거하고 <a href=""> 링크 텍스트 </a>를 유지하는 방법이 있습니까?
Mazen Kasser

6
extension String{
    var htmlStripped : String{
        return self.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)
    }
}

해피 코딩


3

스위프트 4 :

extension String {
    func deleteHTMLTag(tag:String) -> String {
        return self.replacingOccurrences(of: "(?i)</?\(tag)\\b[^<]*>", with: "", options: .regularExpression, range: nil)
    }

    func deleteHTMLTags(tags:[String]) -> String {
        var mutableString = self
        for tag in tags {
            mutableString = mutableString.deleteHTMLTag(tag: tag)
        }
        return mutableString
    }
}

2
또는 다음과 같이 사용할 수 있습니다. func deleteHTMLTag ()-> String {return self.replacingOccurrences (of : "(? i) </? \\ b [^ <] *>", with : "", options : .regularExpression 범위 : 무기 호)}
아닐 쿠마르

이 정규식은 나를 위해 html 코드를 제거하지 않습니다. 문자열 예 : "<b> Cats like </ b> doing something". 작동하지 않는 이유에 대해 더 조사하지 않았습니다. 그러나 text.replacingOccurrences (of : "<[^>] +>", ....)는 내 간단한 경우에 작동합니다.
Benjamin Piette 2018

2

Swift 4 용으로 업데이트되었습니다.

guard let htmlStringData = htmlString.data(using: .unicode) else { fatalError() }

let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
                .documentType: NSAttributedString.DocumentType.html
                .characterEncoding: String.Encoding.unicode.rawValue
             ]

let attributedHTMLString = try! NSAttributedString(data: htmlStringData, options: options, documentAttributes: nil)
let string = attributedHTMLString.string


0

NSAttributedString HTML 변환을 사용하는 것보다 정규식을 사용하는 것을 선호합니다. 시간이 많이 걸리고 메인 스레드에서도 실행해야합니다. 자세한 정보 : https://developer.apple.com/documentation/foundation/nsattributedstring/1524613-initwithdata

나를 위해 이것은 트릭을 만들었습니다. 먼저 CSS 인라인 스타일을 제거하고 나중에 모든 HTML 태그를 제거했습니다. 아마도 NSAttributedString 옵션으로 견고하지는 않지만 내 경우에는 훨씬 빠릅니다.

extension String {
    func withoutHtmlTags() -> String {
        let str = self.replacingOccurrences(of: "<style>[^>]+</style>", with: "", options: .regularExpression, range: nil)
        return str.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.