Essa é uma maneira bastante padrão de fazer isso, minha versão usava um <div>
pensamento:
return $('<div/>').text(t).html();
Isso não é tecnicamente 100% seguro, como observa Mike Samuel, mas provavelmente é bastante seguro na prática.
O Prototype.js atual faz isso:
function escapeHTML() {
return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
}
Mas costumava usar o truque “coloque texto em uma div e extraia o HTML”.
Também há _.escape
em Underscore , que faz assim:
// List of HTML entities for escaping.
var htmlEscapes = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''',
'/': '/'
};
// Regex containing the keys listed immediately above.
var htmlEscaper = /[&<>"'/]/g;
// Escape a string for HTML interpolation.
_.escape = function(string) {
return ('' + string).replace(htmlEscaper, function(match) {
return htmlEscapes[match];
});
};
Essa é praticamente a mesma abordagem do Prototype. A maior parte do JavaScript que faço ultimamente tem Underscore disponível, então tendo a usar _.escape
hoje em dia.