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)


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)

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)

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

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"

@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


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

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

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)
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.