Membatalkan penghapusan string yang mengandung entitas melarikan diri ke string yang berisi karakter Unicode aktual yang sesuai dengan lolos. Mendukung entitas HTML 4.0.
Sayangnya saya baru menyadari hari ini bahwa itu tidak men-decode karakter HTML yang sangat baik :(
Sid
1
trik kotor adalah menyimpan nilai awalnya di bidang tersembunyi untuk menghindarinya, maka bidang target harus mendapatkan nilai dari bidang tersembunyi.
setzamora
2
Kelas StringEscapeUtils tidak digunakan lagi dan dipindahkan ke Apache commons-text
Pauli
2
Saya ingin mengonversi string <p>üè</p>menjadi <p>üé</p>, dengan StringEscapeUtils.unescapeHtml4()saya dapatkan <p>üè</p>. Apakah ada cara untuk menjaga tag html yang ada tetap utuh?
Nickkk
48
Perpustakaan yang disebutkan dalam jawaban lain akan menjadi solusi yang baik, tetapi jika Anda sudah menggali html dunia nyata dalam proyek Anda, Jsoupproyek ini memiliki lebih banyak hal untuk ditawarkan daripada sekadar mengelola "ampersand pound FFFF semicolon" .
// textValue: <p>This is a sample. \"Granny\" Smith –.<\/p>\r\n// becomes this: This is a sample. "Granny" Smith –.// with one line of code:// Jsoup.parse(textValue).getText(); // for older versions of JsoupJsoup.parse(textValue).text();// Another possibility may be the static unescapeEntities method:boolean strictMode =true;String unescapedString = org.jsoup.parser.Parser.unescapeEntities(textValue, strictMode);
Dan Anda juga mendapatkan API yang nyaman untuk mengekstraksi dan memanipulasi data, menggunakan yang terbaik dari metode DOM, CSS, dan seperti jquery. Ini open source dan lisensi MIT.
upvote +, tapi saya harus menunjukkan bahwa versi Jsoup yang lebih baru digunakan .text()alih-alih.getText()
SourceVisor
4
Mungkin lebih langsung adalah menggunakan org.jsoup.parser.Parser.unescapeEntities(String string, boolean inAttribute). API docs: jsoup.org/apidocs/org/jsoup/parser/…
danneu
3
Ini sempurna, karena saya sudah menggunakan Jsoup dalam proyek saya. @Danneu juga benar - Parser.unescapeEntities bekerja persis seperti yang diiklankan.
MandisaW
42
Saya mencoba Apache Commons StringEscapeUtils.unescapeHtml3 () di proyek saya, tetapi tidak puas dengan kinerjanya. Ternyata, ia melakukan banyak operasi yang tidak perlu. Untuk satu, itu mengalokasikan StringWriter untuk setiap panggilan, bahkan jika tidak ada yang dihapus dalam string. Saya telah menulis ulang kode itu secara berbeda, sekarang bekerja lebih cepat. Siapa pun yang menemukan ini di google dapat menggunakannya.
Kode berikut menghapus semua simbol HTML 3 dan pelarian angka (setara dengan Apache unescapeHtml3). Anda bisa menambahkan lebih banyak entri ke peta jika Anda membutuhkan HTML 4.
Baru-baru ini, saya harus mengoptimalkan proyek Struts yang lambat. Ternyata di bawah penutup Struts memanggil Apache untuk string html lolos secara default ( <s:property value="..."/>). Mematikan melarikan diri ( <s:property value="..." escaping="false"/>) membuat beberapa halaman berjalan 5% hingga 20% lebih cepat.
Stephan
Kemudian saya menemukan bahwa kode ini dapat memasukkan loop ketika diberikan string kosong sebagai argumen. Edisi saat ini memiliki masalah yang diperbaiki.
Nick Frolov
Apakah ini lolos atau hilang? & amp; tidak diterjemahkan. Hanya & ditambahkan ke peta, jadi hanya berfungsi satu arah?
mmm
3
StringWriter menggunakan StringBuffer secara internal yang menggunakan penguncian. Menggunakan StringBuilder secara langsung harus lebih cepat.
Axel Dörfler
4
@NickFrolov, komentar Anda agak kacau. aumlmisalnya ädan tidak д.
aioobe
12
Pustaka berikut ini juga dapat digunakan untuk keluar HTML di Jawa: unbescape .
Itu tidak melakukan apa pun untuk ini:%3Chtml%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3Etest%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%3E%0D%0Atest%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E
ThreaT
40
@ThreaT Teks Anda tidak dikodekan html, itu dikodekan url.
Pertimbangkan untuk menggunakan kelas Java HtmlManipulator . Anda mungkin perlu menambahkan beberapa item (tidak semua entitas ada dalam daftar).
Apache Commons StringEscapeUtils seperti yang disarankan oleh Kevin Hakanson tidak bekerja 100% untuk saya; beberapa entitas seperti & # 145 (kutipan tunggal kiri) entah bagaimana diterjemahkan ke '222'. Saya juga mencoba org.jsoup, dan memiliki masalah yang sama.
Dalam kasus saya, saya menggunakan metode ganti dengan menguji setiap entitas di setiap variabel, kode saya terlihat seperti ini:
text = text.replace("Ç","Ç");
text = text.replace("ç","ç");
text = text.replace("Á","Á");
text = text.replace("Â","Â");
text = text.replace("Ã","Ã");
text = text.replace("É","É");
text = text.replace("Ê","Ê");
text = text.replace("Í","Í");
text = text.replace("Ô","Ô");
text = text.replace("Õ","Õ");
text = text.replace("Ó","Ó");
text = text.replace("Ú","Ú");
text = text.replace("á","á");
text = text.replace("â","â");
text = text.replace("ã","ã");
text = text.replace("é","é");
text = text.replace("ê","ê");
text = text.replace("í","í");
text = text.replace("ô","ô");
text = text.replace("õ","õ");
text = text.replace("ó","ó");
text = text.replace("ú","ú");
Ini bukan setiap entitas khusus. Bahkan dua yang disebutkan dalam pertanyaan itu hilang.
Sandy Gifford
ini tidak akan skala dengan baik
denov
-7
Jika Anda ingin meniru apa fungsi php htmlspecialchars_decode tidak menggunakan fungsi php get_html_translation_table () untuk membuang tabel dan kemudian menggunakan kode java seperti,
staticMap<String,String> html_specialchars_table =newHashtable<String,String>();static{
html_specialchars_table.put("<","<");
html_specialchars_table.put(">",">");
html_specialchars_table.put("&","&");}staticString htmlspecialchars_decode_ENT_NOQUOTES(String s){Enumeration en = html_specialchars_table.keys();while(en.hasMoreElements()){String key = en.nextElement();String val = html_specialchars_table.get(key);
s = s.replaceAll(key, val);}return s;}
Jangan membuang terlalu banyak; gunakan obat generik pada HashMap itu! Juga, gunakan foreach, tidak sebentar untuk mengulanginya, kode akan terlihat jauh lebih mudah dibaca!
WhyNotHugo
3
@BalaDutt jika Anda meningkatkan jawaban Anda, orang-orang akan memberi Anda poin :)
sparkyspider
3
Tingkatkan fungsi & nama variabel Anda juga, @Bala.
Jawaban:
Saya telah menggunakan Apache Commons StringEscapeUtils.unescapeHtml4 () untuk ini:
sumber
<p>üè</p>
menjadi<p>üé</p>
, denganStringEscapeUtils.unescapeHtml4()
saya dapatkan<p>üè</p>
. Apakah ada cara untuk menjaga tag html yang ada tetap utuh?Perpustakaan yang disebutkan dalam jawaban lain akan menjadi solusi yang baik, tetapi jika Anda sudah menggali html dunia nyata dalam proyek Anda,
Jsoup
proyek ini memiliki lebih banyak hal untuk ditawarkan daripada sekadar mengelola "ampersand pound FFFF semicolon" .Dan Anda juga mendapatkan API yang nyaman untuk mengekstraksi dan memanipulasi data, menggunakan yang terbaik dari metode DOM, CSS, dan seperti jquery. Ini open source dan lisensi MIT.
sumber
.text()
alih-alih.getText()
org.jsoup.parser.Parser.unescapeEntities(String string, boolean inAttribute)
. API docs: jsoup.org/apidocs/org/jsoup/parser/…Saya mencoba Apache Commons StringEscapeUtils.unescapeHtml3 () di proyek saya, tetapi tidak puas dengan kinerjanya. Ternyata, ia melakukan banyak operasi yang tidak perlu. Untuk satu, itu mengalokasikan StringWriter untuk setiap panggilan, bahkan jika tidak ada yang dihapus dalam string. Saya telah menulis ulang kode itu secara berbeda, sekarang bekerja lebih cepat. Siapa pun yang menemukan ini di google dapat menggunakannya.
Kode berikut menghapus semua simbol HTML 3 dan pelarian angka (setara dengan Apache unescapeHtml3). Anda bisa menambahkan lebih banyak entri ke peta jika Anda membutuhkan HTML 4.
sumber
<s:property value="..."/>
). Mematikan melarikan diri (<s:property value="..." escaping="false"/>
) membuat beberapa halaman berjalan 5% hingga 20% lebih cepat.auml
misalnyaä
dan tidakд
.Pustaka berikut ini juga dapat digunakan untuk keluar HTML di Jawa: unbescape .
HTML dapat dihapus dengan cara ini:
sumber
%3Chtml%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3Etest%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%3E%0D%0Atest%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E
Ini berhasil bagi saya,
atau
Saya kira itu selalu lebih baik untuk menggunakan
lang3
alasan yang jelas. Semoga ini membantu :)sumber
Solusi yang sangat sederhana namun tidak efisien tanpa perpustakaan eksternal adalah:
Ini harus digunakan hanya jika Anda hanya memiliki sedikit string untuk diterjemahkan.
sumber
Cara yang paling dapat diandalkan adalah dengan
dari
org.apache.commons.lang3.StringEscapeUtils
.Dan untuk melarikan diri dari ruang putih
Ini akan memastikan bahwa spasi putih karena menyalin dan menempel di formulir web untuk tidak bertahan di DB.
sumber
Kerangka Kerja HtmlUtils
Jika Anda sudah menggunakan kerangka kerja Spring, gunakan metode berikut:
sumber
Pertimbangkan untuk menggunakan kelas Java HtmlManipulator . Anda mungkin perlu menambahkan beberapa item (tidak semua entitas ada dalam daftar).
Apache Commons StringEscapeUtils seperti yang disarankan oleh Kevin Hakanson tidak bekerja 100% untuk saya; beberapa entitas seperti & # 145 (kutipan tunggal kiri) entah bagaimana diterjemahkan ke '222'. Saya juga mencoba org.jsoup, dan memiliki masalah yang sama.
sumber
Dalam kasus saya, saya menggunakan metode ganti dengan menguji setiap entitas di setiap variabel, kode saya terlihat seperti ini:
Dalam kasus saya ini bekerja dengan sangat baik.
sumber
Jika Anda ingin meniru apa fungsi php htmlspecialchars_decode tidak menggunakan fungsi php get_html_translation_table () untuk membuang tabel dan kemudian menggunakan kode java seperti,
sumber