Saya menulis ekstensi Chrome yang melibatkan melakukan banyak pekerjaan berikut: membersihkan string yang mungkin berisi tag HTML, dengan mengonversi <
, >
dan &
menjadi <
, >
dan &
, masing-masing.
(Dengan kata lain, sama seperti PHP htmlspecialchars(str, ENT_NOQUOTES)
- saya rasa tidak ada kebutuhan nyata untuk mengonversi karakter kutip ganda.)
Ini adalah fungsi tercepat yang saya temukan sejauh ini:
function safe_tags(str) {
return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') ;
}
Tapi masih ada kelambatan besar ketika saya harus menjalankan beberapa ribu string sekaligus.
Adakah yang bisa memperbaiki ini? Ini sebagian besar untuk string antara 10 dan 150 karakter, jika itu membuat perbedaan.
(Satu gagasan yang saya miliki adalah untuk tidak repot-repot menyandikan tanda lebih besar dari - apakah ada bahaya nyata dengan itu?)
sumber
Jawaban:
Anda dapat mencoba meneruskan fungsi callback untuk melakukan penggantian:
Berikut ini adalah uji kinerja: http://jsperf.com/encode-html-entities untuk dibandingkan dengan memanggil
replace
fungsi berulang kali, dan menggunakan metode DOM yang diusulkan oleh Dmitrij.Jalanmu sepertinya lebih cepat ...
Mengapa Anda membutuhkannya?
sumber
>
.if (/[<>&"]/.test(str) { ... }
>
adalah karakter khusus dalam HTML, jadi hindarilah. Sederhana seperti itu. :)>
penggantian, itu akan membuatnya lebih cepat.Inilah salah satu cara Anda dapat melakukan ini:
Berikut demo nya.
sumber
Metode Martijn sebagai fungsi prototipe:
sumber
String
seperti ini, ini harus escapeHtml karena ini bukan pelolosan untuk String pada umumnya. ItuString.escapeHtml
benar, tetapiString.escape
menimbulkan pertanyaan, "melarikan diri untuk apa?"Solusi yang lebih cepat / lebih singkat adalah:
Ini terkait dengan beberapa sisa JavaScript yang aneh di mana elemen Option mempertahankan konstruktor yang melakukan pelolosan semacam ini secara otomatis.
Penghargaan untuk https://github.com/jasonmoo/t.js/blob/master/t.js
sumber
Kode sumber AngularJS juga memiliki versi di dalam angular-sanitize.js .
sumber
Metode tercepat adalah:
Metode ini sekitar dua kali lebih cepat daripada metode berdasarkan 'ganti', lihat http://jsperf.com/htmlencoderegex/35 .
Sumber: https://stackoverflow.com/a/17546215/698168
sumber
Skrip all-in-one:
http://pastebin.com/JGCVs0Ts
sumber
sumber
Saya tidak sepenuhnya yakin tentang kecepatan, tetapi jika Anda mencari untuk kesederhanaan saya akan menyarankan menggunakan / garis bawah lodash melarikan diri fungsi.
sumber
Metode Martijn sebagai fungsi tunggal dengan penanganan tanda " ( menggunakan dalam javascript ):
sumber
Saya akan menambahkan
XMLSerializer
ke tumpukan. Ini memberikan hasil tercepat tanpa menggunakan cache objek apa pun (bukan pada serializer, atau pada node Teks).Bonus tambahannya adalah mendukung atribut yang diserialkan secara berbeda dari node teks:
Anda dapat melihat apa yang sebenarnya diganti dengan memeriksa spesifikasi, baik untuk node teks dan untuk nilai atribut . Dokumentasi lengkap memiliki lebih banyak tipe node, tetapi konsepnya sama.
Untuk kinerja, ini yang tercepat saat tidak di-cache. Jika Anda mengizinkan caching, maka memanggil
innerHTML
HTMLElement dengan node Teks anak adalah yang tercepat. Regex akan menjadi yang paling lambat (seperti yang dibuktikan oleh komentar lain). Tentu saja, XMLSerializer bisa lebih cepat di browser lain, tetapi dalam pengujian (terbatas) saya, yanginnerHTML
tercepat.Garis tunggal tercepat:
new XMLSerializer().serializeToString(document.createTextNode(text));
Tercepat dengan caching:
https://jsperf.com/htmlentityencode/1
sumber
Agak terlambat untuk pertunjukan, tapi apa salahnya menggunakan encodeURIComponent () dan decodeURIComponent () ?
sumber