Трюк jQuery не кодує лапки, і в IE він зніме ваш пробіл.
Спираючись на шаблон тегів для втечі в Django, який, напевно, вже широко використовується / перевіряється, я зробив цю функцію, яка робить те, що потрібно.
Це, мабуть, простіше (і, можливо, швидше), ніж будь-який із способів вирішення проблеми, що знімає пробіл, - і він кодує цитати, що важливо, якщо ви, наприклад, збираєтесь використовувати результат у значенні атрибута.
function htmlEscape(str) {
return str
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
// I needed the opposite function today, so adding here too:
function htmlUnescape(str){
return str
.replace(/"/g, '"')
.replace(/'/g, "'")
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/&/g, '&');
}
Оновлення 2013-06-17:
У пошуках найшвидшого втечі я знайшов цю реалізацію replaceAll
методу:
http://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(також тут посилається: Найшвидший метод заміни всіх екземплярів символу в рядку )
Деякі результати роботи тут:
http://jsperf.com/htmlencoderegex/25
Це дає ідентичний рядок результатів вбудованим replace
ланцюжкам вище. Я був би дуже радий, якби хтось міг пояснити, чому це швидше !?
Оновлення 2015-03-04:
Я щойно помітив, що AngularJS використовує саме вказаний вище метод:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
Вони додають кілька уточнень - вони, мабуть, обробляють незрозумілу проблему Unicode , а також перетворюють усі не алфавітно-цифрові символи в сутності. У мене було враження, що останнє не було необхідним, доки для вашого документа вказано набір UTF8.
Зауважу, що (через 4 роки) Джанго все ще не робить жодної з цих речей, тому я не впевнений, наскільки вони важливі:
https://github.com/django/django/blob/1.8b1/django/utils /html.py#L44
Оновлення 2016-04-06:
Ви також можете уникнути нахилу вперед /
. Це не потрібно для правильного кодування HTML, однак він рекомендує OWASP як запобіжний захід XSS. (дякую @JNF, що він запропонував це у коментарях)
.replace(/\//g, '/');