O truque do jQuery não codifica aspas e, no IE, reduz o espaço em branco.
Baseado no template de escape no Django, que eu acho que já é muito usado / testado, criei essa função que faz o que é necessário.
É sem dúvida mais simples (e possivelmente mais rápido) do que qualquer uma das soluções alternativas para o problema de remoção de espaços em branco - e codifica aspas, o que é essencial se você usar o resultado dentro de um valor de atributo, por exemplo.
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, '&');
}
Atualização 2013-06-17:
Na busca pela fuga mais rápida, encontrei esta implementação de um replaceAll
método:
http://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(também referenciada aqui: mais rápida método para substituir todas as instâncias de um caractere em uma string )
Alguns resultados de desempenho aqui:
http://jsperf.com/htmlencoderegex/25
Ele fornece uma sequência de resultados idêntica às replace
cadeias internas acima. Ficaria muito feliz se alguém pudesse explicar por que é mais rápido !?
Atualização 2015-03-04:
Acabei de perceber que o AngularJS está usando exatamente o método acima:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
Eles adicionam alguns refinamentos - eles parecem estar lidando com um problema Unicode obscuro , além de converter todos os caracteres não alfanuméricos em entidades. Fiquei com a impressão de que o último não era necessário, desde que você tenha um conjunto de caracteres UTF8 especificado para o seu documento.
Vou notar que (4 anos depois) o Django ainda não faz nenhuma dessas coisas, então não tenho certeza de quão importantes elas são:
https://github.com/django/django/blob/1.8b1/django/utils /html.py#L44
Atualização 06/06/2016:
Você também pode querer escapar da barra /
. Isso não é necessário para a codificação HTML correta, no entanto, é recomendado pelo OWASP como uma medida de segurança anti-XSS. (obrigado a @JNF por sugerir isso nos comentários)
.replace(/\//g, '/');