Трюк 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, '/');