Во главе, этот вопрос имеет большую ценность, но как есть, он, скорее всего, будет закрыт, потому что вы не задаете четкого вопроса: это невоспроизводимый сценарий. Я предлагаю вам перефразировать свой вопрос в соответствии с разделом «Как задать вопрос» . Я бы не хотел, чтобы этот вопрос был удален.
Tunaki 08
3
lol stackoverflow ... как это закрыто как "не по теме"? Это результат №1 в Google по запросу "Swift remove html tags".
canhazbits
2
@canhazbits, я правильно знаю! Нажмите повторно открыть, чтобы назначить его для повторного открытия.
Хм, я попробовал вашу функцию, и она сработала на небольшом примере:
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)
Вместо этого я бы подумал об использовании 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 =tryNSAttributedString(data: htmlString.data(using:.unicode)!, options:[NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType], documentAttributes:nil)
print(attributed.string)
Это кажется наиболее чистым подходом, и он прекрасно работает! Лучше позволить проверенной в боях платформе 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.
или вы можете использовать так: func deleteHTMLTag () -> String {return self.replacingOccurrences (of: "(? i) </? \\ b [^ <] *>", with: "", options: .regularExpression , range: nil)}
Анил Кумар
Это регулярное выражение для меня не удаляет HTML-код. Пример строки: «<b> Кошки любят </b> что-то делать». Больше не исследовал, почему это не работает. Но text.replacingOccurrences (of: "<[^>] +>", ....) работает для моих простых случаев.
Для меня это помогло: сначала я удаляю все встроенные стили CSS, а затем все теги HTML. Вероятно, не так надежно, как вариант NSAttributedString, но в моем случае намного быстрее.
Ответы:
Хм, я попробовал вашу функцию, и она сработала на небольшом примере:
Можете привести пример проблемы?
Версия Swift 4 и 5:
источник
<p foo=">now what?">Paragraph</p>
string.replacingOccurrences(of: "<[^>]+>", with: "", options: String.CompareOptions.regularExpression, range: nil)
Поскольку HTML не является обычным языком (HTML - это контекстно-свободный язык), вы не можете использовать регулярные выражения. См .: Использование регулярных выражений для анализа HTML: почему бы и нет?
Вместо этого я бы подумал об использовании NSAttributedString.
Или, как это сделал бы Иршад Мохамед в комментариях:
источник
let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)
большинство людей предпочитают выбирать небольшие и простые для понимания ответы.Решение Mohamed, но как расширение String в Swift 4.
источник
Я использую следующее расширение для удаления определенных элементов HTML:
Это позволяет удалять
<a>
теги только из строки, например:источник
Счастливое кодирование
источник
быстрый 4:
источник
Обновлено для Swift 4:
источник
Я предпочитаю использовать регулярное выражение, чем использовать преобразование NSAttributedString HTML, имейте в виду, что это занимает довольно много времени и также должно выполняться в основном потоке. Дополнительная информация здесь: https://developer.apple.com/documentation/foundation/nsattributedstring/1524613-initwithdata
Для меня это помогло: сначала я удаляю все встроенные стили CSS, а затем все теги HTML. Вероятно, не так надежно, как вариант NSAttributedString, но в моем случае намного быстрее.
источник