Es gibt verschiedene Möglichkeiten, um HTML tags
aus einem NSString
In zu entfernen Cocoa
.
Eine Möglichkeit besteht darin, die Zeichenfolge in eine zu rendern NSAttributedString
und dann den gerenderten Text abzurufen.
Eine andere Möglichkeit ist die Verwendung der Methode NSXMLDocument's
- objectByApplyingXSLTString
Methode, um eine XSLT
Transformation anzuwenden , die dies ausführt.
Leider unterstützt das iPhone nicht NSAttributedString
oder NSXMLDocument
. Es gibt zu viele Randfälle und fehlerhafte HTML
Dokumente, als dass ich mich mit Regex oder Regex wohl fühlen könnte NSScanner
. Hat jemand eine Lösung dafür?
Ein Vorschlag war, einfach nach öffnenden und schließenden Tag-Zeichen zu suchen. Diese Methode funktioniert nur in sehr trivialen Fällen.
Zum Beispiel würden diese Fälle (aus dem Perl-Kochbuch-Kapitel zum gleichen Thema) diese Methode brechen:
<IMG SRC = "foo.gif" ALT = "A > B">
<!-- <A comment> -->
<script>if (a<b && a>c)</script>
<![INCLUDE CDATA [ >>>>>>>>>>>> ]]>
quelle
Antworten:
Eine schnelle und "schmutzige" (entfernt alles zwischen <und>) Lösung, funktioniert mit iOS> = 3.2:
Ich habe dies als Kategorie von NSString deklariert.
quelle
Diese
NSString
Kategorie verwendet dasNSXMLParser
, umHTML
Tags aus einem genau zu entfernenNSString
. Dies ist eine Single.m
und.h
Datei, die einfach in Ihr Projekt aufgenommen werden kann.https://gist.github.com/leighmcculloch/1202238
Anschließend ziehen Sie sich wie
html
folgt aus:Importieren Sie den Header:
Und rufen Sie dann stripHtml auf:
Dies funktioniert auch mit Missbildungen
HTML
, die technisch nicht sindXML
.quelle
Arbeit gut für mich
quelle
Sie können wie unten verwenden
quelle
benutze das
Vergessen Sie nicht, dies in Ihren Code aufzunehmen: #import "RegexKitLite.h" Hier ist der Link zum Herunterladen dieser API: http://regexkit.sourceforge.net/#Downloads
quelle
Schauen Sie sich NSXMLParser an. Es ist ein Parser im SAX-Stil. Sie sollten in der Lage sein, damit Tags oder andere unerwünschte Elemente im XML-Dokument zu erkennen und zu ignorieren, wobei nur reiner Text erfasst wird.
quelle
Hier ist eine effizientere Lösung als die akzeptierte Antwort:
Die obige
NSString
Kategorie verwendet einen regulären Ausdruck, um alle übereinstimmenden Tags zu finden, erstellt eine Kopie der ursprünglichen Zeichenfolge und entfernt schließlich alle vorhandenen Tags, indem sie in umgekehrter Reihenfolge durchlaufen werden. Es ist effizienter, weil:Dies hat für mich gut genug funktioniert, aber eine Lösung, die verwendet wird,
NSScanner
könnte effizienter sein.Wie die akzeptierte Antwort behandelt diese Lösung nicht alle von @lfalin angeforderten Grenzfälle. Diese würden eine viel teurere Analyse erfordern, die der durchschnittliche Anwendungsfall höchstwahrscheinlich nicht benötigt.
quelle
Ohne Schleife (zumindest auf unserer Seite):
quelle
quelle
quelle
Ich habe die Antwort von m.kocikowski erweitert und versucht, sie mithilfe eines NSMutableString etwas effizienter zu gestalten. Ich habe es auch für die Verwendung in einer statischen Utils-Klasse strukturiert (ich weiß, dass eine Kategorie wahrscheinlich das beste Design ist) und die Autorelease entfernt, damit sie in einem ARC-Projekt kompiliert wird.
Hier enthalten, falls jemand es nützlich findet.
.h
.m
quelle
<(?>/?)(?!a).+?>
diesen, um alle Tags mit Ausnahme der öffnenden <a> und schließenden </a> Tags zu entfernen.Wenn Sie den Inhalt ohne die HTML-Tags von der Webseite (HTML-Dokument) abrufen möchten, verwenden Sie diesen Code in der
UIWebViewDidfinishLoading
Delegate- Methode.quelle
Ich würde mir vorstellen, dass der sicherste Weg wäre, nur nach <> s zu analysieren, nein? Durchlaufen Sie die gesamte Zeichenfolge und kopieren Sie alles, was nicht in <> s enthalten ist, in eine neue Zeichenfolge.
quelle
Dies ist die Modernisierung der Antwort von m.kocikowski , die Leerzeichen entfernt:
quelle
Das Folgende ist die akzeptierte Antwort, aber anstelle der Kategorie ist es eine einfache Hilfsmethode, an die eine Zeichenfolge übergeben wird. (danke m.kocikowski)
quelle
Hier ist die schnelle Version:
quelle
stringByReplacingOccurrencesOfString
du verwendest außerhalb des Zyklus ist Prozentcodierung und sollte auf korrekte Weise behoben werden.Wenn Sie bereit sind, das Three20-Framework zu verwenden , verfügt es über eine Kategorie in NSString, die die Methode stringByRemovingHTMLTags hinzufügt. Siehe NSStringAdditions.h im Three20Core-Unterprojekt.
quelle
Erweitern Sie dies mehr aus den Antworten von m.kocikowski und Dan J mit mehr Erklärungen für Neulinge
1 # Zuerst müssen Sie Objective-C-Kategorien erstellen , damit der Code in jeder Klasse verwendet werden kann.
.h
.m
2 # Importieren Sie dann einfach die .h- Datei der soeben erstellten Kategorieklasse, z
3 # Aufrufen der Methode.
Ergebnis ist NSString, von dem ich die Tags entfernen möchte.
quelle
Ich habe die akzeptierte Antwort von m.kocikowski befolgt und etwas geändert, um einen Autoreleasepool zu verwenden, um alle temporären Zeichenfolgen zu bereinigen, die von stringByReplacingCharactersInRange erstellt werden
In dem Kommentar zu dieser Methode heißt es: / * Ersetzen Sie Zeichen im Bereich durch die angegebene Zeichenfolge und geben Sie eine neue Zeichenfolge zurück. * /
Abhängig von der Länge Ihres XML erstellen Sie möglicherweise einen großen Stapel neuer Autorelease-Zeichenfolgen, die erst am Ende des nächsten @ autoreleasepools bereinigt werden. Wenn Sie sich nicht sicher sind, wann dies passieren kann oder ob eine Benutzeraktion zuvor wiederholt viele Aufrufe dieser Methode auslösen könnte, können Sie dies einfach in einem @autoreleasepool zusammenfassen. Diese können sogar verschachtelt und nach Möglichkeit in Schleifen verwendet werden.
In Apples Referenz zu @autoreleasepool heißt es: "Wenn Sie eine Schleife schreiben, die viele temporäre Objekte erstellt. Sie können einen Autorelease-Poolblock innerhalb der Schleife verwenden, um diese Objekte vor der nächsten Iteration zu entsorgen. Verwenden Sie einen Autorelease-Poolblock in der Schleife hilft, den maximalen Speicherbedarf der Anwendung zu reduzieren. " Ich habe es nicht in der Schleife verwendet, aber zumindest bereinigt diese Methode jetzt nach sich selbst.
quelle
Ein anderer Weg:
Schnittstelle:
-(NSString *) stringByStrippingHTML:(NSString*)inputString;
Implementierung
Realisierung
cell.exampleClass.text = [self stringByStrippingHTML:[exampleJSONParsingArray valueForKey: @"key"]];
oder einfach
NSString *myClearStr = [self stringByStrippingHTML:rudeStr];
quelle
Eine aktualisierte Antwort für @ m.kocikowski, die auf aktuellen iOS-Versionen funktioniert.
}}
quelle
In diesem Blogbeitrag werden einige Bibliotheken beschrieben, die zum Entfernen von HTML verfügbar sind. Http://sugarmaplesoftware.com/25/strip-html-tags/ Beachten Sie die Kommentare, in denen andere Lösungen angeboten werden.
quelle