Menghapus tag HTML dari string

97

Bagaimana cara menghapus tag HTML dari string sehingga saya dapat menghasilkan teks bersih?

let str = string.stringByReplacingOccurrencesOfString("<[^>]+>", withString: "", options: .RegularExpressionSearch, range: nil)
print(str)
LED
sumber
Cukup gunakan parser HTML.
The Paramagnetic Croissant
1
Led, pertanyaan ini memiliki banyak nilai tetapi apa adanya, kemungkinan besar akan ditutup karena Anda tidak mengajukan pertanyaan yang jelas: ini adalah skenario yang tidak dapat direproduksi. Saya sarankan Anda mengubah pertanyaan Anda sesuai dengan Cara Bertanya . Saya tidak ingin pertanyaan itu dihapus.
Tunaki
3
lol stackoverflow ... bagaimana ini ditutup sebagai "di luar topik"? Ini adalah hasil google # 1 untuk "Swift remove html tags".
canhazbits
2
@canhazbits saya tahu benar! Klik buka kembali untuk menominasikannya untuk dibuka kembali.
Dipimpin
1
Swift 3: string.replacingOccurrences (dari: "<[^>] +>", dengan: "", options: .regularExpression, range: nil)
etayluz

Jawaban:

147

Hmm, saya mencoba fungsi Anda dan berhasil pada contoh kecil:

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

Bisakah Anda memberi contoh masalah?

Versi Swift 4 dan 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)
Steve Rosenberg
sumber
25
<LOL> Ha Ha! </LOL>
Steve Rosenberg
1
Misalnya, coba bagian HTML ini:<p foo=">now what?">Paragraph</p>
The Paramagnetic Croissant
32
Di Swift 3 string.replacingOccurrences(of: "<[^>]+>", with: "", options: String.CompareOptions.regularExpression, range: nil)
Husam
5
Dalam Swift 4 string.replacingOccurrences (dari: "<[^>] +>", dengan: "", opsi: .regularExpression, range: nil)
Raegtime
29

Karena HTML bukan bahasa biasa (HTML adalah bahasa tanpa konteks ), Anda tidak dapat menggunakan Ekspresi Reguler. Lihat: Menggunakan ekspresi reguler untuk mengurai HTML: mengapa tidak?

Saya akan mempertimbangkan untuk menggunakan NSAttributedString sebagai gantinya.

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

Atau, seperti yang dilakukan Irshad Mohamed dalam komentarnya:

let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
print(attributed.string)
Joony
sumber
7
Ini tampaknya pendekatan yang paling bersih dan bekerja dengan sangat baik! Sebaiknya biarkan framework Foundation yang teruji pertempuran menangani ini untuk Anda, daripada menulis parser tidak stabil sendiri.
Shyam Bhat
4
Bersih!! let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)kebanyakan orang lebih suka memilih jawaban yang kecil dan mudah dimengerti.
Irshad Mohamed
1
Terima kasih atas solusinya! Apakah mungkin untuk menyimpan spasi dan jeda baris sementara kita menghapus tag html? Saat ini, semua pemisah baris diabaikan di string baru.
Astha Gupta
7
Hanya peringatan menggunakan ini: Pengubahan gaya HTML (pengaitan) lambat! . Seorang insinyur CoreText di WWDC mengatakan kepada saya bahwa ini tidak lagi dipertahankan dan dia telah melupakannya sepenuhnya.
Sirene
1
Hanya peringatan tentang peringatan sebelumnya: Mari kita lihat beberapa data sebelum kita membuang metode karena terlalu "lambat". Ada banyak pustaka C yang Anda gunakan (seringkali tanpa disadari) yang tidak memerlukan banyak pemeliharaan. Itu tidak selalu berarti buruk.
Joony
11

Solusi Mohamed tetapi sebagai ekstensi String di 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
sumber
8

Saya menggunakan ekstensi berikut untuk menghapus elemen HTML tertentu:

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

Ini memungkinkan untuk hanya menghapus <a>tag dari string, misalnya:

let string = "my html <a href="">link text</a>"
let withoutHTMLString = string.deleteHTMLTag("a") // Will be "my  html link text"
Antoine
sumber
@Mr Lister adakah cara untuk menghapus semua tag html dan menyimpan <a href=""> teks tautan </a> ini?
Mazen Kasser
6
extension String{
    var htmlStripped : String{
        return self.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)
    }
}

Selamat Coding

Benny Davidovitz
sumber
3

cepat 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
    }
}
Logika
sumber
2
atau Anda dapat menggunakan seperti ini: func deleteHTMLTag () -> String {return self.replacingOccurrences (dari: "(? i) </? \\ b [^ <] *>", dengan: "", opsi: .regularExpression , kisaran: nil)}
Anil Kumar
Regex ini tidak menghapus kode html untuk saya. Contoh string: "<b> Kucing suka </b> melakukan sesuatu". Tidak menyelidiki lebih lanjut alasan mengapa itu tidak berhasil. Tapi text.replacingOccurrences (dari: "<[^>] +>", ....) berfungsi untuk kasus sederhana saya.
Benjamin Piette
2

Diperbarui untuk 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
sumber
Anda kehilangan ',' setelah
.documentType
0

Saya lebih suka menggunakan ekspresi reguler daripada menggunakan konversi HTML NSAttributedString, perhatikan bahwa cukup memakan waktu dan perlu dijalankan di utas utama juga. Informasi lebih lanjut di sini: https://developer.apple.com/documentation/foundation/nsattributedstring/1524613-initwithdata

Bagi saya ini membuat trik, pertama saya menghapus semua gaya sebaris CSS, dan kemudian semua tag HTML. Mungkin tidak sekuat opsi NSAttributedString, tetapi jauh lebih cepat untuk kasus saya.

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)
    }
}
pasak
sumber