Doprowadziło to, że to pytanie ma dużą wartość, ale w obecnym kształcie prawdopodobnie zostanie zamknięte, ponieważ nie zadasz jasnego pytania: jest to scenariusz niemożliwy do odtworzenia. Sugeruję przeformułowanie pytania zgodnie z instrukcją Jak zadawać . Nie chciałbym, aby to pytanie zostało usunięte.
Tunaki
3
lol stackoverflow ... jak to jest zamknięte jako „poza tematem”? Jest to nr 1 w wynikach Google dla zapytania „Szybkie usuwanie tagów html”.
canhazbits
2
@canhazbits, wiem dobrze! Kliknij opcję Otwórz ponownie, aby wyznaczyć ją jako otwartą ponownie.
Hmm, wypróbowałem twoją funkcję i zadziałała na małym przykładzie:
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. "
Czy możesz podać przykład problemu?
Wersja Swift 4 i 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)
Zamiast tego rozważyłbym użycie 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
Lub, jak zrobiłby to Irshad Mohamed w komentarzach:
Wydaje się, że jest to najczystsze podejście i działa cudownie! Najlepiej pozwolić, aby przetestowany w boju framework Foundation załatwił to za Ciebie, zamiast samodzielnie pisać niestabilne parsery.
Shyam Bhat
4
Czysty!! let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)większość ludzi woli wybierać odpowiedzi, które są małe i łatwe do zrozumienia.
Irshad Mohamed
1
Dzięki za rozwiązanie! Czy można zapisać spacje i podziały wierszy, gdy usuwamy tagi HTML? Obecnie wszystkie podziały wierszy są pomijane w nowym ciągu.
Astha Gupta
7
Tylko ostrzeżenie: konwertowanie (przypisywanie) stylu HTML powolne! . Inżynier CoreText z WWDC powiedział mi, że nie jest to już obsługiwane i całkowicie o tym zapomniał.
Syreny
1
Tylko ostrzeżenie dotyczące poprzedniego ostrzeżenia: zobaczmy trochę danych, zanim odrzucimy metodę, która jest zbyt „wolna”. Istnieje wiele bibliotek C, których używasz (często nie zdając sobie z tego sprawy), które nie wymagają wiele konserwacji. To niekoniecznie jest złe.
Joony
13
Rozwiązanie Mohameda, ale jako rozszerzenie ciągu w Swift 4.
lub możesz użyć w ten sposób: func deleteHTMLTag () -> String {return self.replacingOccurrences (of: "(? i) </? \\ b [^ <] *>", with: "", options: .Expression , range: nil)}
Anil Kumar
To wyrażenie regularne nie powoduje usunięcia kodu HTML za mnie. Przykładowy ciąg: „<b> Koty lubią </b> coś robić”. Nie zbadałem więcej powodu, dla którego to nie działa. Ale text.replacingOccurrences (of: "<[^>] +>", ....) działa w moich prostych przypadkach.
W moim przypadku to załatwiło sprawę, najpierw usuwam wszelkie wbudowane style CSS, a później wszystkie znaczniki HTML. Prawdopodobnie nie jest solidny, jak opcja NSAttributedString, ale znacznie szybciej w moim przypadku.
Odpowiedzi:
Hmm, wypróbowałem twoją funkcję i zadziałała na małym przykładzie:
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. "
Czy możesz podać przykład problemu?
Wersja Swift 4 i 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)
źródło
<p foo=">now what?">Paragraph</p>
string.replacingOccurrences(of: "<[^>]+>", with: "", options: String.CompareOptions.regularExpression, range: nil)
Ponieważ HTML nie jest językiem zwykłym (HTML jest językiem bezkontekstowym ), nie możesz używać wyrażeń regularnych. Zobacz: Używanie wyrażeń regularnych do analizowania kodu HTML: dlaczego nie?
Zamiast tego rozważyłbym użycie 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
Lub, jak zrobiłby to Irshad Mohamed w komentarzach:
let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)
źródło
let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)
większość ludzi woli wybierać odpowiedzi, które są małe i łatwe do zrozumienia.Rozwiązanie Mohameda, ale jako rozszerzenie ciągu w 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 } } }
źródło
Używam następującego rozszerzenia, aby usunąć określone elementy 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 } }
Dzięki temu możliwe jest usuwanie tylko
<a>
tagów z ciągu znaków, np .:let string = "my html <a href="">link text</a>" let withoutHTMLString = string.deleteHTMLTag("a") // Will be "my html link text"
źródło
extension String{ var htmlStripped : String{ return self.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil) } }
Miłego kodowania
źródło
szybki 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 } }
źródło
Zaktualizowano dla 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
źródło
Wolę używać wyrażeń regularnych niż używać konwersji HTML NSAttributedString, pamiętaj, że jest to dość czasochłonne i musi być również uruchamiane w głównym wątku. Więcej informacji tutaj: https://developer.apple.com/documentation/foundation/nsattributedstring/1524613-initwithdata
W moim przypadku to załatwiło sprawę, najpierw usuwam wszelkie wbudowane style CSS, a później wszystkie znaczniki HTML. Prawdopodobnie nie jest solidny, jak opcja NSAttributedString, ale znacznie szybciej w moim przypadku.
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) } }
źródło