Видалення HTML-тегів із рядка


95

Як видалити теги HTML із рядка, щоб я міг вивести чистий текст?

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


1
Під керівництвом, це питання має велику цінність, але таким, яке є, його, швидше за все, закриють, оскільки ви не задаєте чіткого питання: це невідтворюваний сценарій. Я пропоную вам переформулювати своє питання відповідно до "Як запитати" . Я б не хотів, щоб це питання було видалено.
— Тунакі

3
ха-ха stackoverflow ... як це закрито як "поза темою"? Це перший результат Google для "Швидкого видалення тегів HTML".
— canhazbits

2
@canhazbits я знаю правильно! Клацніть повторно відкрити, щоб призначити його знову відкритим.
— Вів

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

Відповіді:


147

Хм, я спробував твою функцію, і вона працювала на невеликому прикладі:

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> Ха-ха! </LOL>
— Стів Розенберг,


1
Наприклад, спробуйте цей фрагмент HTML:<p foo=">now what?">Paragraph</p>
— Парамагнітний круасан

32
У Swift 3 string.replacingOccurrences(of: "<[^>]+>", with: "", options: String.CompareOptions.regularExpression, range: nil)
— Хусам

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

29

Оскільки 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

Або, як це зробив Іршад Мохамед у коментарях:

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

7
Здається, це найчистіший підхід, і він чудово працює! Найкраще дозволити перевіреному боями фреймворку вирішити це за вас, замість того, щоб писати парсерні парсери самостійно.
— Шям Бхат,

4
Чисто !! let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)більшість людей воліють вибирати відповіді, які є невеликими та простими для розуміння.
— Іршад Мохамед

1
Дякую за рішення! Чи можна зберегти пробіли та розриви рядків під час видалення тегів html? Наразі всі розриви рядків у новому рядку не враховуються.
— Astha Gupta

7
Тільки попередження, використовуючи це: Стиль HTML перетворює (приписує) повільно! . Інженер CoreText з WWDC сказав мені, що це більше не підтримується, і він повністю про це забув.
— Sirens

1
Просто попередження про попереднє попередження: Давайте подивимось деякі дані, перш ніж відкинути метод за занадто «повільний». Існує безліч бібліотек, якими ви користуєтесь (часто, не усвідомлюючи цього), які не потребують особливого обслуговування. Це не обов'язково погано.
— Джоні

10

Рішення Мохамеда, але як розширення рядка в 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

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

Щасливого кодування


3

стрімкий 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 , діапазон: нуль)}
— Anil Kumar

Цей регулярний вираз не видаляє для мене HTML-код. Приклад рядка: "<b> Кішки люблять </b> щось робити". Не досліджував більше з тієї причини, чому це не працює. Але text.replacingOccurrences (of: "<[^>] +>", ....) працює для моїх простих випадків.
— Бенджамін Піетт

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)
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.