Ada beberapa cara berbeda untuk menghapus HTML tags
dari NSString
dalam Cocoa
.
Salah satu caranya adalah dengan membuat string menjadi NSAttributedString
dan kemudian mengambil teks yang dirender.
Cara lain adalah dengan menggunakan NSXMLDocument's
- objectByApplyingXSLTString
metode untuk menerapkan XSLT
transformasi yang melakukannya.
Sayangnya, iPhone tidak mendukung NSAttributedString
atau NSXMLDocument
. Ada terlalu banyak kasus tepi dan HTML
dokumen rusak sehingga saya merasa nyaman menggunakan regex atau NSScanner
. Apakah ada yang punya solusi untuk ini?
Salah satu saran adalah hanya mencari karakter tag pembuka dan penutup, metode ini tidak akan berfungsi kecuali untuk kasus yang sangat sepele.
Misalnya, kasus ini (dari bab Buku Resep Perl tentang subjek yang sama) akan merusak metode ini:
<IMG SRC = "foo.gif" ALT = "A > B">
<!-- <A comment> -->
<script>if (a<b && a>c)</script>
<![INCLUDE CDATA [ >>>>>>>>>>>> ]]>
sumber
Jawaban:
Solusi cepat dan "kotor" (menghapus segala sesuatu antara <dan>), bekerja dengan iOS> = 3.2:
Saya telah menyatakan ini sebagai kategori os NSString.
sumber
NSString
Kategori ini menggunakanNSXMLParser
untuk secara akurat menghapusHTML
tag apa pun dariNSString
. Ini adalah satu.m
dan.h
file yang dapat dimasukkan ke dalam proyek Anda dengan mudah.https://gist.github.com/leighmcculloch/1202238
Anda kemudian menghapus
html
dengan melakukan hal berikut:Impor tajuk:
Dan kemudian panggil stripHtml:
Ini juga bekerja dengan cacat
HTML
yang secara teknis tidakXML
.sumber
bekerja dengan baik untuk saya
sumber
Anda bisa menggunakan seperti di bawah ini
sumber
Gunakan ini
jangan lupa untuk memasukkan ini ke dalam kode Anda: #import "RegexKitLite.h" di sini adalah tautan untuk mengunduh API ini: http://regexkit.sourceforge.net/#Downloads
sumber
Lihat NSXMLParser. Ini adalah pengurai gaya SAX. Anda harus dapat menggunakannya untuk mendeteksi tag atau elemen lain yang tidak diinginkan dalam dokumen XML dan mengabaikannya, hanya menangkap teks murni.
sumber
Berikut solusi yang lebih efisien daripada jawaban yang diterima:
NSString
Kategori di atas menggunakan ekspresi reguler untuk menemukan semua tag yang cocok, membuat salinan dari string asli dan akhirnya menghapus semua tag di tempatnya dengan mengulanginya dalam urutan terbalik. Lebih efisien karena:Ini berkinerja cukup baik bagi saya tetapi penggunaan solusi
NSScanner
mungkin lebih efisien.Seperti jawaban yang diterima, solusi ini tidak menangani semua kasus perbatasan yang diminta oleh @lfalin. Itu akan membutuhkan penguraian yang jauh lebih mahal yang kemungkinan besar tidak diperlukan oleh kasus penggunaan rata-rata.
sumber
Tanpa loop (setidaknya di pihak kami):
sumber
sumber
sumber
Saya telah memperpanjang jawabannya dengan m.kocikowski dan mencoba membuatnya sedikit lebih efisien dengan menggunakan NSMutableString. Saya juga telah menyusunnya untuk digunakan dalam kelas Utils statis (saya tahu Kategori mungkin adalah desain terbaik), dan menghapus autorelease sehingga dikompilasi dalam proyek ARC.
Disertakan di sini jika ada yang menganggapnya berguna.
.h
.m
sumber
<(?>/?)(?!a).+?>
ini akan menghapus semua tag kecuali tag pembuka <a> dan penutup </a>.Jika Anda ingin mendapatkan konten tanpa tag html dari halaman web (dokumen HTML), gunakan kode ini di dalam metode
UIWebViewDidfinishLoading
delegasi .sumber
Saya akan membayangkan cara teraman hanya dengan mengurai <> s, bukan? Ulangi seluruh string, dan salin semua yang tidak diapit <> s ke string baru.
sumber
Ini adalah modernisasi jawaban m.kocikowski yang menghilangkan spasi:
sumber
berikut ini adalah jawaban yang diterima, tetapi alih-alih kategori, ini adalah metode pembantu sederhana dengan string yang dilewatkan ke dalamnya. (terima kasih m.kocikowski)
sumber
Berikut versi cepatnya:
sumber
stringByReplacingOccurrencesOfString
u gunakan di luar siklus adalah encoding persen dan harus diperbaiki melalui cara yang benar.Jika Anda ingin menggunakan kerangka kerja Three20 , ia memiliki kategori di NSString yang menambahkan metode stringByRemovingHTMLTags. Lihat NSStringAdditions.h di subproyek Three20Core.
sumber
Memperluas ini lebih banyak dari jawaban m.kocikowski dan Dan J dengan lebih banyak penjelasan untuk pemula
1 # Pertama Anda harus membuat tujuan-kategori-c untuk membuat kode dapat digunakan di kelas manapun.
.h
.m
2 # Kemudian cukup impor file .h dari kelas kategori yang baru saja Anda buat misalnya
3 # Memanggil Metode.
Hasilnya adalah NSString yang ingin saya hapus tagnya.
sumber
Saya telah mengikuti jawaban yang diterima oleh m.kocikowski dan dimodifikasi sedikit untuk menggunakan autoreleasepool untuk membersihkan semua string sementara yang dibuat oleh stringByReplacingCharactersInRange
Dalam komentar untuk metode ini dinyatakan, / * Ganti karakter dalam rentang dengan string yang ditentukan, mengembalikan string baru. * /
Jadi, bergantung pada panjang XML Anda, Anda mungkin membuat tumpukan besar string autorelease baru yang tidak dibersihkan hingga akhir @autoreleasepool berikutnya. Jika Anda tidak yakin kapan itu mungkin terjadi atau jika tindakan pengguna dapat berulang kali memicu banyak panggilan ke metode ini sebelumnya, Anda dapat membungkusnya dengan @autoreleasepool. Ini bahkan dapat disarangkan dan digunakan dalam loop jika memungkinkan.
Referensi Apple di @autoreleasepool menyatakan ini ... "Jika Anda menulis loop yang membuat banyak objek sementara. Anda dapat menggunakan blok kumpulan autorelease di dalam loop untuk membuang objek tersebut sebelum iterasi berikutnya. Menggunakan blok kumpulan autorelease di loop membantu mengurangi jejak memori maksimum aplikasi. " Saya belum menggunakannya dalam loop, tetapi setidaknya metode ini membersihkan dirinya sendiri sekarang.
sumber
Satu cara lain:
Antarmuka:
-(NSString *) stringByStrippingHTML:(NSString*)inputString;
Penerapan
Realisasi
cell.exampleClass.text = [self stringByStrippingHTML:[exampleJSONParsingArray valueForKey: @"key"]];
atau sederhana
NSString *myClearStr = [self stringByStrippingHTML:rudeStr];
sumber
Jawaban terbaru untuk @ m.kocikowski yang berfungsi pada versi iOS terbaru.
}
sumber
Berikut adalah entri blog yang membahas beberapa perpustakaan yang tersedia untuk menghapus HTML http://sugarmaplesoftware.com/25/strip-html-tags/ Perhatikan komentar di mana solusi lain ditawarkan.
sumber