Уловка jQuery не кодирует кавычки, а в IE она лишит вас пробелов.
Основываясь на теге escape- шаблона в 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, '/');