การตัดแท็ก HTML ออกจากสตริง


98

ฉันจะลบแท็ก HTML ออกจากสตริงเพื่อให้สามารถแสดงผลข้อความที่สะอาดได้อย่างไร

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


1
Led คำถามนี้มีค่ามาก แต่ตามที่เป็นอยู่มีแนวโน้มที่จะถูกปิดเนื่องจากคุณไม่ได้ถามคำถามที่ชัดเจน: เป็นสถานการณ์ที่ไม่สามารถทำซ้ำได้ ผมแนะนำให้คุณใช้ถ้อยคำคำถามของคุณเป็นไปตามวิธีการขอ ฉันไม่อยากให้คำถามนั้นถูกลบไป
Tunaki

3
lol stackoverflow ... นี่ปิดเป็น "off topic" ได้อย่างไร? เป็นผลการค้นหาอันดับ 1 ของ Google สำหรับ "Swift remove html tags"
canhazbits

2
@canhazbits ฉันรู้ถูก! คลิกเปิดอีกครั้งเพื่อเสนอชื่อเพื่อเปิดอีกครั้ง
นำ

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

คำตอบ:


151

อืมฉันลองใช้ฟังก์ชั่นของคุณแล้วและได้ผลในตัวอย่างเล็ก ๆ :

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

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

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

30

เนื่องจาก 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

4
สะอาด !! let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)คนส่วนใหญ่ชอบเลือกคำตอบที่มีขนาดเล็กและเข้าใจง่าย
Irshad Mohamed

1
ขอบคุณสำหรับการแก้ปัญหา! เป็นไปได้ไหมที่จะบันทึกช่องว่างและตัวแบ่งบรรทัดในขณะที่เราลบแท็ก html ปัจจุบันการแบ่งบรรทัดทั้งหมดจะไม่ถูกนำมาพิจารณาในสตริงใหม่
Astha Gupta

7
เพียงคำเตือนโดยใช้สิ่งนี้: การแปลงรูปแบบ HTML (แอตทริบิวต์) ช้า! . วิศวกร CoreText ของ WWDC บอกว่านี่ไม่ได้รับการดูแลอีกต่อไปและเขาลืมเรื่องนี้ไปทั้งหมด
ไซเรน

1
คำเตือนเกี่ยวกับคำเตือนก่อนหน้านี้เรามาดูข้อมูลบางส่วนก่อนที่เราจะทิ้งวิธีการที่ "ช้าเกินไป" มีไลบรารี C มากมายที่คุณใช้ (มักจะไม่รู้ตัว) ที่ไม่ต้องการการดูแลรักษามากนัก นั่นไม่จำเป็นต้องเป็นเรื่องเลวร้าย
Joony

14

โซลูชัน Mohamed แต่เป็นส่วนขยาย String ใน 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


2

รวดเร็ว 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 , range: nil)}
Anil Kumar

regex นี้ไม่ได้ตัดโค้ด html ออกให้ฉัน สตริงตัวอย่าง: "<b> แมวชอบ </b> ทำอะไรบางอย่าง" ไม่ได้ตรวจสอบเพิ่มเติมถึงสาเหตุที่ไม่ได้ผล แต่ text.replacingOccurrences (of: "<[^>] +>", .... ) ใช้ได้กับกรณีง่ายๆของฉัน
Benjamin Piette

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

คุณไม่มี "," หลัง. documentType: param
cwgso

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.