最快的方法将HTML标签转义为HTML实体?
我正在编写一个Chrome扩展,它涉及到很多以下工作:通过将<
, >
和&
转换为<
, >
和&
, 分别。
(换句话说,就像PHP的htmlspecialchars(str, ENT_NOQUOTES)
– 我不认为有任何实际的需要转换双引号字符。)
这是迄今为止我发现的最快的功能:
function safe_tags(str) { return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') ; }
但是,如果我一次只能运行几千个字符串,还是有很大的滞后。
任何人都可以改善呢? 这主要是10到150个字符之间的字符串,如果这有所作为。
(我有一个想法是不打扰编码大于号 – 将有任何真正的危险呢?)
你可以尝试传递一个回调函数来执行替换:
var tagsToReplace = { '&': '&', '<': '<', '>': '>' }; 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 = { '&': '&', '<': '<', '>': '>' }; return this.replace(/[&<>]/g, function(tag) { return tagsToReplace[tag] || tag; }); }; var a = "<abc>"; var b = a.escape(); // "<abc>"
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, '&'). 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, '<'). replace(/>/g, '>'); }
一体化脚本:
// HTML entities Encode/Decode function htmlspecialchars(str) { var map = { "&": "&", "<": "<", ">": ">", "\"": """, "'": "'" // ' -> ' for XML only }; return str.replace(/[&<>"']/g, function(m) { return map[m]; }); } function htmlspecialchars_decode(str) { var map = { "&": "&", "<": "<", ">": ">", """: "\"", "'": "'" }; return str.replace(/(&|<|>|"|')/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; }
最快的方法是:
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 &ersand (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 = { '&': '&', '<': '<', '>': '>', '"': '"' }; return charsToReplace[tag] || tag; } return html.replace(/[&<>"]/g, fn); }