最快的方法将HTML标签转义为HTML实体?

我正在编写一个Chrome扩展,它涉及到很多以下工作:通过将<>&转换为&lt;&gt;&amp; , 分别。

(换句话说,就像PHP的htmlspecialchars(str, ENT_NOQUOTES) – 我不认为有任何实际的需要转换双引号字符。)

这是迄今为止我发现的最快的功能:

 function safe_tags(str) { return str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;') ; } 

但是,如果我一次只能运行几千个字符串,还是有很大的滞后。

任何人都可以改善呢? 这主要是10到150个字符之间的字符串,如果这有所作为。

(我有一个想法是不打扰编码大于号 – 将有任何真正的危险呢?)

你可以尝试传递一个回调函数来执行替换:

 var tagsToReplace = { '&': '&amp;', '<': '&lt;', '>': '&gt;' }; function replaceTag(tag) { return tagsToReplace[tag] || tag; } function safe_tags_replace(str) { return str.replace(/[&<>]/g, replaceTag); } 

这里是一个性能测试: http : //jsperf.com/encode-html-entities反复调用replace函数,并使用Dmitrij提出的DOM方法进行比较。

你的方式似乎更快…

为什么你需要它,但?

以下是您可以执行此操作的一种方法:

 var escape = document.createElement('textarea'); function escapeHTML(html) { escape.textContent = html; return escape.innerHTML; } function unescapeHTML(html) { escape.innerHTML = html; return escape.textContent; } 

这是一个演示。

Martijn的方法作为原型功能:

 String.prototype.escape = function() { var tagsToReplace = { '&': '&amp;', '<': '&lt;', '>': '&gt;' }; return this.replace(/[&<>]/g, function(tag) { return tagsToReplace[tag] || tag; }); }; var a = "<abc>"; var b = a.escape(); // "&lt;abc&gt;" 

AngularJS源代码在angular-sanitize.js中也有一个版本。

 var SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, // Match everything outside of normal chars and " (quote character) NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; /** * Escapes all potentially dangerous characters, so that the * resulting string can be safely inserted into attribute or * element text. * @param value * @returns {string} escaped text */ function encodeEntities(value) { return value. replace(/&/g, '&amp;'). replace(SURROGATE_PAIR_REGEXP, function(value) { var hi = value.charCodeAt(0); var low = value.charCodeAt(1); return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';'; }). replace(NON_ALPHANUMERIC_REGEXP, function(value) { return '&#' + value.charCodeAt(0) + ';'; }). replace(/</g, '&lt;'). replace(/>/g, '&gt;'); } 

一体化脚本:

 // HTML entities Encode/Decode function htmlspecialchars(str) { var map = { "&": "&amp;", "<": "&lt;", ">": "&gt;", "\"": "&quot;", "'": "&#39;" // ' -> &apos; for XML only }; return str.replace(/[&<>"']/g, function(m) { return map[m]; }); } function htmlspecialchars_decode(str) { var map = { "&amp;": "&", "&lt;": "<", "&gt;": ">", "&quot;": "\"", "&#39;": "'" }; return str.replace(/(&amp;|&lt;|&gt;|&quot;|&#39;)/g, function(m) { return map[m]; }); } function htmlentities(str) { var textarea = document.createElement("textarea"); textarea.innerHTML = str; return textarea.innerHTML; } function htmlentities_decode(str) { var textarea = document.createElement("textarea"); textarea.innerHTML = str; return textarea.value; } 

http://pastebin.com/JGCVs0Ts

最快的方法是:

 function escapeHTML(html) { return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML; } 

这个方法比基于'replace'的方法快两倍,请参阅http://jsperf.com/htmlencoderegex/35

资料来源: https : //stackoverflow.com/a/17546215/698168

 function encode(r) { return r.replace(/[\x26\x0A\x3c\x3e\x22\x27]/g, function(r) { return "&#" + r.charCodeAt(0) + ";"; }); } test.value=encode('How to encode\nonly html tags &<>\'" nice & fast!'); /* \x26 is &ampersand (it has to be first), \x0A is newline, \x22 is ", \x27 is ', \x3c is <, \x3e is > */ 
 <textarea id=test rows=11 cols=55>www.WHAK.com</textarea> 

Martijn的方法作为单一的功能与处理马克( 在JavaScript中使用 ):

 function escapeHTML(html) { var fn=function(tag) { var charsToReplace = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&#34;' }; return charsToReplace[tag] || tag; } return html.replace(/[&<>"]/g, fn); }