Eu escrevi uma pequena função que faz isso. Ele só escapa "
, &
, <
e >
(mas geralmente isso é tudo que você precisa de qualquer maneira). É um pouco mais elegante do que as soluções propostas anteriormente, pois usa apenas uma .replace()
para fazer toda a conversão. ( EDIÇÃO 2: complexidade do código reduzida, tornando a função ainda menor e mais organizada, se você estiver curioso sobre o código original, veja o final desta resposta.)
function escapeHtml(text) {
'use strict';
return text.replace(/[\"&<>]/g, function (a) {
return { '"': '"', '&': '&', '<': '<', '>': '>' }[a];
});
}
Isso é Javascript simples, sem jQuery usado.
Escapando /
e '
também
Edite em resposta ao comentário de mklement .
A função acima pode ser facilmente expandida para incluir qualquer caractere. Para especificar mais caracteres para escapar, basta inseri-los na classe de caracteres na expressão regular (ou seja, dentro da /[...]/g
) e como uma entrada no chr
objeto. ( EDIT 2: Também reduziu esta função, da mesma maneira.)
function escapeHtml(text) {
'use strict';
return text.replace(/[\"&'\/<>]/g, function (a) {
return {
'"': '"', '&': '&', "'": ''',
'/': '/', '<': '<', '>': '>'
}[a];
});
}
Observe o uso acima de '
para apóstrofo (a entidade simbólica '
poderia ter sido usado em vez disso - ele é definido em XML, mas não foi originalmente incluído no HTML especificação e pode, portanto, não ser suportado por todos os navegadores Veja:. Artigo da Wikipedia sobre codificação de caracteres em HTML ) Também me lembro de ler em algum lugar que o uso de entidades decimais é mais amplamente suportado do que o hexadecimal, mas não consigo encontrar a fonte para isso agora. (E não pode haver muitos navegadores por aí que não suportem entidades hexadecimais.)
Nota: Adicionar /
e '
à lista de caracteres de escape não é tão útil, pois eles não têm nenhum significado especial em HTML e não precisam ser escapados.
escapeHtml
Função original
EDIT 2: A função original usava uma variável ( chr
) para armazenar o objeto necessário para o .replace()
retorno de chamada. Essa variável também precisava de uma função anônima extra para fazer o escopo, tornando a função (desnecessariamente) um pouco maior e mais complexa.
var escapeHtml = (function () {
'use strict';
var chr = { '"': '"', '&': '&', '<': '<', '>': '>' };
return function (text) {
return text.replace(/[\"&<>]/g, function (a) { return chr[a]; });
};
}());
Eu não testei qual das duas versões é mais rápida. Se o fizer, sinta-se à vontade para adicionar informações e links sobre isso aqui.