Istnieje kilka różnych sposobów usuwania HTML tags
plików NSString
w formacie in Cocoa
.
Jednym ze sposobów jest wyrenderowanie ciągu znaków NSAttributedString
i pobranie wyrenderowanego tekstu.
Innym sposobem jest użycie NSXMLDocument's
- objectByApplyingXSLTString
metody zastosowania XSLT
transformacji, która to robi.
Niestety iPhone nie obsługuje NSAttributedString
lub NSXMLDocument
. Jest zbyt wiele przypadków skrajnych i źle sformułowanych HTML
dokumentów, abym czuł się komfortowo używając wyrażeń regularnych lub NSScanner
. Czy ktoś ma na to rozwiązanie?
Jedną z sugestii było po prostu szukanie znaków otwierających i zamykających znaczników, ta metoda nie zadziała z wyjątkiem bardzo trywialnych przypadków.
Na przykład te przypadki (z rozdziału książki kucharskiej Perla na ten sam temat) zepsują tę metodę:
<IMG SRC = "foo.gif" ALT = "A > B">
<!-- <A comment> -->
<script>if (a<b && a>c)</script>
<![INCLUDE CDATA [ >>>>>>>>>>>> ]]>
źródło
Odpowiedzi:
Szybkie i "brudne" (usuwa wszystko między <i>) rozwiązanie, działa z iOS> = 3.2:
Mam to zadeklarowane jako kategoria w NSString.
źródło
Ta
NSString
kategoria używa rozszerzeniaNSXMLParser
do dokładnego usuwania wszelkichHTML
tagów zNSString
. To jest singiel.m
i.h
plik, który można łatwo dołączyć do projektu.https://gist.github.com/leighmcculloch/1202238
Następnie rozbierzesz
html
się, wykonując następujące czynności:Zaimportuj nagłówek:
A następnie wywołaj stripHtml:
Działa to również w przypadku zniekształceń,
HTML
które technicznie nie sąXML
.źródło
działa dobrze dla mnie
źródło
Możesz użyć jak poniżej
źródło
Użyj tego
nie zapomnij umieścić tego w swoim kodzie: #import „RegexKitLite.h” tutaj jest łącze do pobrania tego interfejsu API: http://regexkit.sourceforge.net/#Downloads
źródło
Spójrz na NSXMLParser. To parser w stylu SAX. Powinieneś móc go używać do wykrywania znaczników lub innych niechcianych elementów w dokumencie XML i ignorowania ich, przechwytując tylko czysty tekst.
źródło
Oto skuteczniejsze rozwiązanie niż przyjęta odpowiedź:
Powyższa
NSString
kategoria używa wyrażenia regularnego, aby znaleźć wszystkie pasujące tagi, tworzy kopię oryginalnego ciągu i ostatecznie usuwa wszystkie tagi w miejscu, wykonując po nich iterację w odwrotnej kolejności. Jest bardziej wydajna, ponieważ:To działało dla mnie wystarczająco dobrze, ale rozwiązanie wykorzystujące
NSScanner
może być bardziej wydajne.Podobnie jak przyjęta odpowiedź, to rozwiązanie nie dotyczy wszystkich przypadków granicznych, o które prosił @lfalin. Wymagałoby to znacznie droższego parsowania, którego przeciętny przypadek użycia najprawdopodobniej nie potrzebuje.
źródło
Bez pętli (przynajmniej po naszej stronie):
źródło
źródło
źródło
Rozszerzyłem odpowiedź m.kocikowskiego i próbowałem uczynić ją nieco bardziej wydajną za pomocą NSMutableString. Skonstruowałem go również do użycia w statycznej klasie Utils (wiem, że kategoria jest prawdopodobnie najlepszym projektem) i usunąłem autorelease, więc kompiluje się w projekcie ARC.
Zawarte tutaj na wypadek, gdyby ktoś uznało to za przydatne.
.h
.m
źródło
<(?>/?)(?!a).+?>
to spowoduje usunięcie wszystkich tagów z wyjątkiem tagów otwierających <a> i zamykających </a>.Jeśli chcesz pobrać zawartość bez tagów HTML ze strony internetowej (dokumentu HTML), użyj tego kodu wewnątrz metody
UIWebViewDidfinishLoading
delegata .źródło
Wyobrażam sobie, że najbezpieczniejszym sposobem byłoby po prostu przeanalizować <> s, nie? Przejdź przez cały ciąg i skopiuj wszystko, co nie jest zawarte w <> s do nowego ciągu.
źródło
Oto unowocześnienie odpowiedzi m.kocikowskiego, która usuwa spacje:
źródło
poniżej jest akceptowana odpowiedź, ale zamiast kategorii jest to prosta metoda pomocnicza z przekazanym ciągiem znaków. (dziękuję m.kocikowski)
źródło
Oto szybka wersja:
źródło
stringByReplacingOccurrencesOfString
używasz poza cyklem kodowania procentowego i powinno być naprawione w odpowiedni sposób.Jeśli chcesz użyć frameworka Three20 , ma on kategorię na NSString, która dodaje metodę stringByRemovingHTMLTags. Zobacz NSStringAdditions.h w podprojekcie Three20Core.
źródło
Rozszerzając to bardziej na odpowiedzi m.Kocikowskiego i Dana J z dodatkowymi wyjaśnieniami dla początkujących
1 # Najpierw musisz utworzyć kategorie z celem, aby kod był użyteczny w dowolnej klasie.
.h
.m
2 # Następnie po prostu zaimportuj plik .h klasy kategorii, którą właśnie utworzyłeś, np
3 # Wywołanie metody.
wynik to NSString, z którego chcę usunąć tagi.
źródło
Postępowałem zgodnie z zaakceptowaną odpowiedzią autorstwa m.kocikowskiego i nieznacznie zmodyfikowałem, aby użyć puli autoreleasepool do czyszczenia wszystkich tymczasowych ciągów, które są tworzone przez stringByReplacingCharactersInRange
W komentarzu do tej metody stwierdza się, / * Zamień znaki w zakresie na określony ciąg, zwracając nowy ciąg. * /
Tak więc, w zależności od długości pliku XML, możesz tworzyć ogromny stos nowych ciągów autorelease, które nie są czyszczone do końca następnej puli @autoreleasepool. Jeśli nie masz pewności, kiedy to może się zdarzyć lub jeśli akcja użytkownika mogłaby wielokrotnie wyzwolić wiele wywołań tej metody wcześniej, możesz po prostu zapakować to w @autoreleasepool. W miarę możliwości można je nawet zagnieżdżać i używać w pętlach.
Dokument Apple w @autoreleasepool stwierdza to ... „Jeśli napiszesz pętlę, która tworzy wiele obiektów tymczasowych. Możesz użyć bloku puli autorelease wewnątrz pętli, aby pozbyć się tych obiektów przed następną iteracją. Używanie bloku puli autorelease w pętli pomaga zmniejszyć maksymalne zużycie pamięci przez aplikację. ” Nie używałem go w pętli, ale przynajmniej ta metoda czyści się teraz po sobie.
źródło
Inny sposób:
Berło:
-(NSString *) stringByStrippingHTML:(NSString*)inputString;
Realizacja
Realizacja
cell.exampleClass.text = [self stringByStrippingHTML:[exampleJSONParsingArray valueForKey: @"key"]];
lub proste
NSString *myClearStr = [self stringByStrippingHTML:rudeStr];
źródło
Zaktualizowana odpowiedź dla @ m.kocikowski, która działa na najnowszych wersjach iOS.
}
źródło
Oto post na blogu omawiający kilka bibliotek dostępnych do usuwania kodu HTML http://sugarmaplesoftware.com/25/strip-html-tags/ Zwróć uwagę na komentarze, w których oferowane są inne rozwiązania.
źródło