Loại bỏ các thẻ HTML khỏi một chuỗi


95

Làm cách nào để xóa các thẻ HTML khỏi một chuỗi để tôi có thể xuất ra văn bản sạch?

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


1
Đã dẫn, câu hỏi này có rất nhiều giá trị nhưng hiện tại, nó có khả năng bị kết thúc bởi vì bạn không hỏi một câu hỏi rõ ràng: đó là một kịch bản không thể tái tạo. Tôi khuyên bạn nên diễn đạt lại câu hỏi của mình theo Cách hỏi . Tôi không muốn câu hỏi đó bị xóa.
Tunaki

3
lol stackoverflow ... làm thế nào mà cái này bị đóng lại là "lạc đề"? Đây là kết quả số 1 trên google cho "Swift remove html tags".
canhazbits

2
@canhazbits tôi biết đúng! Nhấp vào mở lại để đề cử mở lại lần nữa.
dẫn

1
Swift 3: string.replacingOccurrences (trong số: "<[^>] +>", với: "", options: .regularExpression, range: nil)
etayluz

Câu trả lời:


147

Rất tiếc, tôi đã thử chức năng của bạn và nó hoạt động trên một ví dụ nhỏ:

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

Bạn có thể đưa ra một ví dụ về một vấn đề?

Phiên bản Swift 4 và 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
Ví dụ: hãy thử đoạn HTML này:<p foo=">now what?">Paragraph</p>
The Paramagnetic Croissant,

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

5
Trong Swift 4 string.replacingOccurrences (of: "<[^>] +>", với: "", options: .regularExpression, range: nil)
Raegtime

29

Vì HTML không phải là ngôn ngữ thông thường (HTML là ngôn ngữ không có ngữ cảnh ), bạn không thể sử dụng Biểu thức chính quy. Xem: Sử dụng biểu thức chính quy để phân tích cú pháp HTML: tại sao không?

Tôi sẽ xem xét sử dụng NSAttributedString thay thế.

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

Hoặc, như Irshad Mohamed trong các bình luận sẽ làm điều đó:

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

7
Đây có vẻ là cách tiếp cận sạch sẽ nhất và nó hoạt động rất tốt! Tốt nhất là để cho khung Foundation đã được thử nghiệm trong trận xử lý việc này cho bạn, thay vì tự viết các trình phân tích cú pháp dễ hiểu.
Shyam Bhat

4
Dọn dẹp!! let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)hầu hết mọi người thích chọn những câu trả lời nhỏ và dễ hiểu.
Irshad Mohamed

1
Cảm ơn vì giải pháp! Có thể lưu khoảng trắng và ngắt dòng khi chúng tôi xóa các thẻ html không? Hiện tại, tất cả các ngắt dòng đều bị bỏ qua trong chuỗi mới.
Astha Gupta,

7
Chỉ là một cảnh báo bằng cách sử dụng này: Chuyển đổi kiểu HTML (phân bổ) chậm! . Một kỹ sư CoreText tại WWDC nói với tôi rằng điều này không còn được duy trì nữa và anh ấy đã hoàn toàn quên mất nó.
Sirens

1
Chỉ là cảnh báo về cảnh báo trước: Hãy xem một số dữ liệu trước khi chúng tôi loại bỏ một phương pháp vì quá "chậm". Có rất nhiều thư viện C mà bạn sử dụng (thường không nhận ra) mà không cần bảo trì nhiều. Đó không hẳn là một điều xấu.
Joony

10

Giải pháp Mohamed nhưng là một phần mở rộng chuỗi trong 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

Tôi đang sử dụng tiện ích mở rộng sau để xóa các phần tử HTML cụ thể:

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

Điều này giúp bạn chỉ có thể xóa <a>các thẻ khỏi một chuỗi, ví dụ:

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

@Mr Lister có cách nào để xóa tất cả các thẻ html và giữ lại <a href=""> văn bản liên kết </a> này không?
Mazen Kasser

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

Mã hóa vui vẻ


3

nhanh chóng 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
hoặc bạn có thể sử dụng như sau: func deleteHTMLTag () -> String {return self.replacingOccurrences (of: "(? i) </? \\ b [^ <] *>", với: "", options: .regularExpression , khoảng: nil)}
Anil Kumar

Regex này không loại bỏ mã html cho tôi. Chuỗi ví dụ: "<b> Mèo thích </b> đang làm gì đó". Không điều tra thêm lý do tại sao nó không hoạt động. Nhưng text.replacingOccurrences (of: "<[^>] +>", ....) hoạt động đối với các trường hợp đơn giản của tôi.
Benjamin Piette

2

Cập nhật cho 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

bạn đang thiếu dấu ',' sau
.documentType

0

Tôi thích sử dụng một biểu thức chính quy hơn là sử dụng chuyển đổi HTML NSAttributedString, xin lưu ý rằng điều đó khá tốn thời gian và cần được chạy trên chuỗi chính. Thông tin thêm tại đây: https://developer.apple.com/documentation/foundation/nsattributedstring/1524613-initwithdata

Đối với tôi, đây là một mẹo, trước tiên tôi xóa mọi kiểu nội tuyến CSS và sau đó là tất cả các thẻ HTML. Có thể không chắc chắn như tùy chọn NSAttributedString, nhưng nhanh hơn đối với trường hợp của tôi.

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)
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.