Bir dizeden HTML etiketlerinin çıkarılması


98

Temiz metin çıktısını alabilmek için bir dizeden HTML etiketlerini nasıl kaldırırım?

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


1
Bu sorunun çok değeri var ama olduğu gibi, net bir soru sormadığınız için kapanma olasılığı yüksek: bu tekrarlanamaz bir senaryo. Sorunuzu Nasıl Sorulur başlığına göre yeniden ifade etmenizi öneririm . Bu sorunun silinmesini istemem.
Tunaki

3
lol stackoverflow ... bu "konu dışı" olarak nasıl kapatılır? Bu, "Swift html etiketlerini kaldır" için 1 numaralı google sonucudur.
canhazbits

2
@canhazbits doğru biliyorum! Yeniden açılmak üzere aday göstermek için yeniden aç'ı tıklayın.
Led

1
Swift 3: string.replacingOccurrences (of: "<[^>] +>", with: "", options: .regularExpression, range: nil)
etayluz

Yanıtlar:


150

Hmm, işlevini denedim ve küçük bir örnek üzerinde çalıştı:

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

Bir problem örneği verebilir misiniz?

Swift 4 ve 5 versiyonu:

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
Örneğin, şu HTML parçasını deneyin:<p foo=">now what?">Paragraph</p>
The Paramagnetic Croissant

32
In Swift 3 string.replacingOccurrences(of: "<[^>]+>", with: "", options: String.CompareOptions.regularExpression, range: nil)
Husam

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

30

HTML normal bir dil olmadığından (HTML bağlamdan bağımsız bir dildir), Normal İfadeleri kullanamazsınız. Bkz .: HTML'yi ayrıştırmak için normal ifadeleri kullanma: neden olmasın?

Bunun yerine NSAttributedString kullanmayı düşünürdüm.

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

Ya da Irshad Mohamed'in yorumlarda yapacağı gibi:

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

7
Bu en temiz yaklaşım gibi görünüyor ve harika bir şekilde çalışıyor! Kesintili ayrıştırıcıları kendi başınıza yazmak yerine, savaşta test edilmiş Temel çerçevesinin bunu sizin için halletmesine izin vermek en iyisidir.
Shyam Bhat

4
Temiz!! let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)çoğu insan küçük ve anlaşılması kolay yanıtları seçmeyi tercih eder.
Irshad Mohamed

1
Çözüm için teşekkürler! Html etiketlerini kaldırırken boşlukları ve satır sonlarını kaydetmek mümkün müdür? Şu anda, tüm satır sonları yeni dizede göz ardı edilmektedir.
Astha Gupta

7
Bunu kullanan bir uyarı: HTML stili dönüştürme (ilişkilendirme) yavaş! . WWDC'deki bir CoreText mühendisi bana bunun artık sürdürülmediğini ve tamamen unuttuğunu söyledi.
Sirenler

1
Sadece bir önceki uyarı hakkında bir uyarı: Çok "yavaş" olmanın bir yöntemini atmadan önce bazı verileri görelim. Fazla bakım gerektirmeyen (genellikle farkında olmadan) kullandığınız çok sayıda C kütüphanesi vardır. Bu mutlaka kötü bir şey değil.
Joony

13

Mohamed çözümü, ancak Swift 4'te bir String uzantısı olarak.

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

Belirli HTML öğelerini kaldırmak için aşağıdaki uzantıyı kullanıyorum:

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

Bu, yalnızca <a>bir dizeden etiketlerin kaldırılmasını mümkün kılar , örneğin:

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

@Mr Lister, tüm html etiketlerini kaldırmanın ve bu <a href=""> bağlantı metnini </a> saklamanın bir yolu var mı?
Mazen Kasser

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

Mutlu Kodlama


2

hızlı 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
veya şu şekilde kullanabilirsiniz: func deleteHTMLTag () -> String {return self.replacingOccurrences (of: "(? i) </? \\ b [^ <] *>", with: "", options: .regularExpression , aralık: nil)}
Anil Kumar

Bu normal ifade html kodunu benim için çıkarmaz. Örnek dize: "<b> Kediler bir şeyler yapmaktan hoşlanır </b>". Neden işe yaramadığı için daha fazla araştırmadım. Ancak text.replacingOccurrences (of: "<[^>] +>", ....) basit durumlarım için işe yarar.
Benjamin Piette

2

Swift 4 için güncellendi:

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

.documentType: param
cwgso'dan

0

NSAttributedString HTML dönüşümünü kullanmak yerine normal bir ifade kullanmayı tercih ederim, bunun oldukça zaman alıcı olduğunu ve ana iş parçacığında da çalıştırılması gerektiğini unutmayın. Daha fazla bilgi burada: https://developer.apple.com/documentation/foundation/nsattributedstring/1524613-initwithdata

Benim için hile yaptı, önce herhangi bir CSS satır içi stilini ve sonra tüm HTML etiketlerini kaldırdım. Muhtemelen NSAttributedString seçeneği kadar sağlam değil, ama benim durumum için çok daha hızlı.

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)
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.