Apakah ada cara yang baik untuk menghapus HTML dari string Java? Seperti regex sederhana
replaceAll("\\<.*?>","")
akan berfungsi, tetapi hal-hal seperti &
tidak akan dikonversi dengan benar dan non-HTML antara dua sudut kurung akan dihapus (yaitu .*?
di dalam regex akan hilang).
Jawaban:
Gunakan parser HTML alih-alih regex. Ini benar-benar sederhana dengan Jsoup .
Jsoup juga mendukung penghapusan tag HTML terhadap daftar putih yang dapat disesuaikan, yang sangat berguna jika Anda hanya ingin mengizinkan mis.
<b>
,<i>
Dan<u>
.Lihat juga:
sumber
Jsoup#clean()
sebagai gantinya.<p>Lorem ipsum 1 < 3 dolor sit amet</p>
. Sekali lagi, HTML bukan bahasa biasa . Ini benar-benar di luar saya mengapa semua orang terus mencoba untuk melemparkan regex di atasnya untuk menguraikan bagian-bagian yang menarik daripada menggunakan parser nyata.Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));
untuk melestarikan linebreakJika Anda menulis untuk Android, Anda dapat melakukan ini ...
sumber
Jika pengguna masuk
<b>hey!</b>
, apakah Anda ingin menampilkan<b>hey!</b>
atauhey!
? Jika yang pertama, lepas lebih sedikit daripada yang lain, dan ampersand html-encode (dan kutip opsional) dan Anda baik-baik saja. Modifikasi kode Anda untuk menerapkan opsi kedua adalah:tetapi Anda akan mengalami masalah jika pengguna memasukkan sesuatu yang salah bentuk
<bhey!</b>
.Anda juga dapat melihat JTidy yang akan menguraikan input html "kotor", dan akan memberi Anda cara untuk menghapus tag, menjaga teks.
Masalah dengan mencoba menghapus html adalah browser memiliki parser yang sangat lunak, lebih lunak daripada perpustakaan mana pun yang dapat Anda temukan, jadi meskipun Anda melakukan yang terbaik untuk menghapus semua tag (menggunakan metode ganti di atas, pustaka DOM, atau JTidy) , Anda masih perlu memastikan untuk menyandikan karakter khusus HTML yang tersisa untuk menjaga keamanan output Anda.
sumber
Cara lain adalah dengan menggunakan javax.swing.text.html.HTMLEditorKit untuk mengekstraksi teks.
ref: Hapus tag HTML dari file untuk mengekstrak hanya TEKS
sumber
Saya pikir cara termudah untuk memfilter tag html adalah:
sumber
Juga sangat sederhana menggunakan Jericho , dan Anda dapat mempertahankan beberapa pemformatan (penghentian baris dan tautan, misalnya).
sumber
Jawaban yang diterima dari melakukan hanya
Jsoup.parse(html).text()
memiliki 2 masalah potensial (dengan JSoup 1.7.3):<script>
menjadi<script>
Jika Anda menggunakan ini untuk melindungi terhadap XSS, ini agak menjengkelkan. Ini adalah kesempatan terbaik saya untuk solusi yang ditingkatkan, menggunakan JSoup dan Apache StringEscapeUtils:
Perhatikan bahwa langkah terakhir adalah karena saya perlu menggunakan output sebagai teks biasa. Jika Anda hanya membutuhkan output HTML maka Anda harus dapat menghapusnya.
Dan di sini ada banyak kasus uji (input ke output):
Jika Anda menemukan cara untuk membuatnya lebih baik, beri tahu saya.
sumber
&lt;script&gt;alert('Evil script executed');&lt;/script&gt;
. Sama berlaku untuk&
. JSoup tidak mengonversi<script> into <script>
, ia melakukan itu karena Anda meneleponStringEscapeUtils.unescapeHtml
setelah JSoup membersihkan input.Di Android, coba ini:
sumber
Escaping HTML benar-benar sulit untuk dilakukan dengan benar - saya pasti akan menyarankan menggunakan kode perpustakaan untuk melakukan ini, karena jauh lebih halus daripada yang Anda pikirkan. Lihatlah StringEscapeUtils dari Apache untuk pustaka yang cukup bagus untuk menangani ini di Java.
sumber
Ini seharusnya bekerja -
Gunakan ini
dan ini
sumber
Anda mungkin ingin mengganti
<br/>
dan memberi</p>
tag dengan baris baru sebelum menghapus HTML untuk mencegahnya menjadi kekacauan yang tidak terbaca seperti yang disarankan Tim.Satu-satunya cara saya bisa memikirkan menghapus tag HTML tetapi meninggalkan non-HTML antara kurung sudut akan diperiksa terhadap daftar tag HTML . Sesuatu di sepanjang garis ini ...
Kemudian HTML-decode karakter khusus seperti
&
. Hasilnya tidak boleh dianggap sanitasi.sumber
Atau, Anda dapat menggunakan HtmlCleaner :
sumber
Jawaban yang diterima tidak bekerja untuk saya untuk kasus uji yang saya sebutkan: hasil "a <b atau b> c" adalah "ab atau b> c".
Jadi, saya menggunakan TagSoup sebagai gantinya. Ini foto yang berhasil untuk test case saya (dan beberapa lainnya):
sumber
Saya tahu ini sudah lama, tetapi saya baru saja mengerjakan proyek yang mengharuskan saya untuk memfilter HTML dan ini berfungsi dengan baik:
alih-alih ini:
sumber
Berikut pembaruan yang sedikit lebih sempurna untuk mencoba menangani beberapa pemformatan untuk jeda dan daftar. Saya menggunakan output Amaya sebagai panduan.
sumber
Menggunakan
Html.fromHtml
Tag HTML adalah
Sesuai Dokumentasi resmi Android, tag apa pun dalam HTML akan ditampilkan sebagai String pengganti generik yang kemudian dapat dilalui oleh program Anda dan diganti dengan string nyata .
Html.formHtml
metode mengambilHtml.TagHandler
dan Html.ImageGetter sebagai argumen serta teks untuk diuraikan.Contoh
Kemudian
Keluaran
Ini tentang saya teks yang dapat dimasukkan pengguna ke profil mereka
sumber
Berikut adalah satu lagi varian cara mengganti semua (Tag HTML | Entitas HTML | Ruang Kosong dalam konten HTML)
content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", "");
di mana konten adalah sebuah String.sumber
Anda cukup menggunakan filter HTML default Android
Metode di atas akan mengembalikan string yang difilter HTML untuk input Anda.
sumber
Satu cara lagi adalah dengan menggunakan kelas com.google.gdata.util.common.html.HtmlToText seperti
Ini bukan kode bukti peluru dan ketika saya menjalankannya pada entri wikipedia saya mendapatkan info gaya juga. Namun saya percaya untuk pekerjaan kecil / sederhana ini akan efektif.
sumber
Sepertinya Anda ingin beralih dari HTML ke teks biasa.
Jika demikian, lihat www.htmlparser.org. Berikut adalah contoh yang menghapus semua tag dari file html yang ditemukan di URL.
Itu memanfaatkan org.htmlparser.beans.StringBean .
sumber
Berikut cara lain untuk melakukannya:
sumber
Orang juga bisa menggunakan Apache Tika untuk tujuan ini. Secara default ia mempertahankan spasi putih dari html yang dilucuti, yang mungkin diinginkan dalam situasi tertentu:
sumber
Parse.parse(InputStream, ContentHandler, Metadata, ParseContext)
.Salah satu cara untuk mempertahankan informasi baris baru dengan JSoup adalah dengan mendahului semua tag baris baru dengan beberapa string dummy, jalankan JSoup dan ganti string dummy dengan "\ n".
sumber
sumber
5 sen saya:
sumber
Untuk mendapatkan teks html biasa yang telah diformat, Anda dapat melakukannya:
Untuk mendapatkan perubahan teks biasa yang diformat <br/> oleh \ n dan ubah baris terakhir dengan:
sumber
Saya tahu ini sudah lama sejak pertanyaan ini diajukan, tetapi saya menemukan solusi lain, inilah yang bekerja untuk saya:
sumber
Anda cukup membuat metode dengan multiple replaceAll () seperti
Gunakan tautan ini untuk penggantian paling umum yang Anda butuhkan: http://tunes.org/wiki/html_20special_20characters_20and_20symbols.html
Ini sederhana tetapi efektif. Saya menggunakan metode ini pertama untuk menghapus sampah tetapi bukan baris pertama yaitu replaceAll ("\ <. *?>", ""), Dan kemudian saya menggunakan kata kunci spesifik untuk mencari indeks dan kemudian menggunakan .substring (mulai, akhiri ) metode untuk menghapus hal-hal yang tidak perlu. Karena ini lebih kuat dan Anda dapat menunjukkan dengan tepat apa yang Anda butuhkan di seluruh halaman html.
sumber
Hapus tag HTML dari string. Di suatu tempat kita perlu mengurai beberapa string yang diterima oleh beberapa tanggapan seperti Httpresponse dari server.
Jadi kita perlu menguraikannya.
Di sini saya akan menunjukkan cara menghapus tag html dari string.
sumber
new System.Text.RegularExpressions.Regex();
?