Удаление HTML-тегов из строки


97

Как удалить HTML-теги из строки, чтобы выводить чистый текст?

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


1
Во главе, этот вопрос имеет большую ценность, но как есть, он, скорее всего, будет закрыт, потому что вы не задаете четкого вопроса: это невоспроизводимый сценарий. Я предлагаю вам перефразировать свой вопрос в соответствии с разделом «Как задать вопрос» . Я бы не хотел, чтобы этот вопрос был удален.
Tunaki 08

3
lol stackoverflow ... как это закрыто как "не по теме"? Это результат №1 в Google по запросу "Swift remove html tags".
canhazbits

2
@canhazbits, я правильно знаю! Нажмите повторно открыть, чтобы назначить его для повторного открытия.
Led

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

Ответы:


148

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

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

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
Это кажется наиболее чистым подходом, и он прекрасно работает! Лучше позволить проверенной в боях платформе Foundation сделать это за вас, а не писать нестандартные парсеры самостоятельно.
Шьям Бхат

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
Просто предупреждение о предыдущем предупреждении: давайте посмотрим некоторые данные, прежде чем отбросить метод из-за того, что он слишком "медленный". Вы используете множество библиотек C (часто даже не осознавая этого), которые не требуют особого обслуживания. Это не обязательно плохо.
Joony

11

Решение 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"

@ Господин Листер, есть ли способ удалить все теги 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 , range: nil)}
Анил Кумар

Это регулярное выражение для меня не удаляет 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)
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.