Видалення 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.