HTML-Tags aus einer Zeichenfolge entfernen

95

Wie entferne ich HTML-Tags aus einer Zeichenfolge, damit ich sauberen Text ausgeben kann?

let str = string.stringByReplacingOccurrencesOfString("<[^>]+>", withString: "", options: .RegularExpressionSearch, range: nil)
print(str)
LED
quelle
Verwenden Sie einfach einen HTML-Parser.
Das paramagnetische Croissant
1
Diese Frage hat viel Wert, aber so wie sie ist, wird sie wahrscheinlich geschlossen, weil Sie keine klare Frage stellen: Es ist ein nicht reproduzierbares Szenario. Ich schlage vor, dass Sie Ihre Frage gemäß How to Ask umformulieren . Ich möchte nicht, dass diese Frage gelöscht wird.
Tunaki
3
lol stackoverflow ... wie wird das als "off topic" geschlossen? Es ist das beste Google-Ergebnis für "Swift HTML-Tags entfernen".
Canhazbits
2
@canhazbits ich weiß richtig! Klicken Sie auf Erneut öffnen, um es für eine erneute Öffnung zu nominieren.
Led
1
Swift 3: string.replacingOccurrences (von: "<[^>] +>", mit: "", Optionen: .regularExpression, Bereich: nil)
etayluz

Antworten:

146

Hmm, ich habe deine Funktion ausprobiert und sie hat an einem kleinen Beispiel funktioniert:

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. "

Können Sie ein Beispiel für ein Problem geben?

Swift 4 und 5 Version:

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)
Steve Rosenberg
quelle
25
<LOL> Ha Ha! </ LOL>
Steve Rosenberg
1
Versuchen Sie zum Beispiel dieses Stück HTML:<p foo=">now what?">Paragraph</p>
Das paramagnetische Croissant
32
In Swift 3 string.replacingOccurrences(of: "<[^>]+>", with: "", options: String.CompareOptions.regularExpression, range: nil)
Husam
5
In Swift 4 string.replacingOccurrences (von: "<[^>] +>", mit: "", Optionen: .regularExpression, Bereich: nil)
Raegtime
29

Da HTML keine reguläre Sprache ist (HTML ist eine kontextfreie Sprache), können Sie keine regulären Ausdrücke verwenden. Siehe: Verwenden von regulären Ausdrücken zum Parsen von HTML: Warum nicht?

Ich würde stattdessen NSAttributedString verwenden.

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

Oder wie Irshad Mohamed es in den Kommentaren tun würde:

let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
print(attributed.string)
Joony
quelle
7
Dies scheint der sauberste Ansatz zu sein und es funktioniert wunderbar gut! Es ist am besten, das kampferprobte Foundation-Framework dies für Sie erledigen zu lassen, anstatt selbst schuppige Parser zu schreiben.
Shyam Bhat
4
Reinigen!! let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)Die meisten Menschen bevorzugen Antworten, die klein und leicht zu verstehen sind.
Irshad Mohamed
1
Danke für die Lösung! Ist es möglich, Leerzeichen und Zeilenumbrüche zu speichern, während wir HTML-Tags entfernen? Derzeit werden alle Zeilenumbrüche in der neuen Zeichenfolge nicht berücksichtigt.
Astha Gupta
7
Nur eine Warnung, die dies verwendet: HTML-Stil konvertieren (zuschreiben) langsam! . Ein CoreText-Ingenieur bei WWDC sagte mir, dass dies nicht mehr gewartet wird und er es völlig vergessen hatte.
Sirenen
1
Nur eine Warnung zur vorherigen Warnung: Sehen wir uns einige Daten an, bevor wir eine Methode verwerfen, die zu "langsam" ist. Es gibt viele C-Bibliotheken, die Sie verwenden (oft ohne es zu merken) und die nicht viel Wartung erfordern. Das ist nicht unbedingt eine schlechte Sache.
Joony
10

Mohamed-Lösung, aber als String-Erweiterung in 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
        }
    }
}
Andrew
quelle
8

Ich verwende die folgende Erweiterung, um bestimmte HTML-Elemente zu entfernen:

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

Dies ermöglicht es, nur <a>Tags aus einer Zeichenfolge zu entfernen , z.

let string = "my html <a href="">link text</a>"
let withoutHTMLString = string.deleteHTMLTag("a") // Will be "my  html link text"
Antoine
quelle
@ Herr Lister, gibt es eine Möglichkeit, alle HTML-Tags zu entfernen und diesen <a href=""> Linktext </a> beizubehalten?
Mazen Kasser
6
extension String{
    var htmlStripped : String{
        return self.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)
    }
}

Viel Spaß beim Codieren

Benny Davidovitz
quelle
3

schnell 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
    }
}
Logik
quelle
2
oder Sie können Folgendes verwenden: func deleteHTMLTag () -> String {return self.replacingOccurrences (von: "(? i) </? \\ b [^ <] *>", mit: "", Optionen: .regularExpression , Bereich: Null)}
Anil Kumar
Dieser reguläre Ausdruck entfernt für mich keinen HTML-Code. Beispielzeichenfolge: "<b> Katzen mögen </ b> etwas tun". Ich habe nicht mehr nachgeforscht, warum es nicht funktioniert. Aber text.replacingOccurrences (von: "<[^>] +>", ....) funktioniert für meine einfachen Fälle.
Benjamin Piette
2

Aktualisiert für 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
Lee Irvine
quelle
Sie vermissen ein ',' nach dem .documentType: param
cwgso
0

Ich bevorzuge die Verwendung eines regulären Ausdrucks als die Verwendung der NSAttributedString-HTML-Konvertierung. Beachten Sie, dass dies ziemlich zeitaufwändig ist und auch im Hauptthread ausgeführt werden muss. Weitere Informationen finden Sie hier: https://developer.apple.com/documentation/foundation/nsattributedstring/1524613-initwithdata

Für mich war dies der Trick. Zuerst entferne ich alle CSS-Inline-Stile und später alle HTML-Tags. Wahrscheinlich nicht solide wie die NSAttributedString-Option, aber für meinen Fall viel schneller.

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)
    }
}
Pegpeg
quelle