Escape HTML using jQuery [duplicate] Escape HTML using jQuery [duplicate] jquery jquery

Escape HTML using jQuery [duplicate]


That's a pretty standard way of doing it, my version used a <div> though:

return $('<div/>').text(t).html();

This isn't technically 100% safe though as Mike Samuel notes but it is probably pretty safe in practice.

The current Prototype.js does this:

function escapeHTML() {    return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');}

But it used to use the "put text in a div and extract the HTML" trick.

There's also _.escape in Underscore, that does it like this:

// List of HTML entities for escaping.var htmlEscapes = {  '&': '&',  '<': '<',  '>': '>',  '"': '"',  "'": '&#x27;',  '/': '&#x2F;'};// 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];  });};

That's pretty much the same approach as Prototype's. Most of the JavaScript I do lately has Underscore available so I tend to use _.escape these days.


There is no guarantee that html() will be completely escaped so the result might not be safe after concatenation.

html() is based on innerHTML, and a browser could, without violating lots of expectations, implement innerHTML so that $("<i></i>").text("1 <").html() is "1 <", and that $("<i></i>").text("b>").html() is "b>".

Then if you concatenate those two individually safe results, you get "1 <b>" which will obviously not be the HTML version of the concatenation of the two plaintext pieces.

So, this method is not safe by deduction from first principles, and there's no widely followed spec of innerHTML (though HTML5 does address it).

The best way to check if it does what you want is to test corner cases like this.


That should work. That's basically how the Prototype.js library does it, or at least how it used to do it. I generally do it with three calls to ".replace()" but that's mostly just a habit.