cal*_*lum 93 html javascript regex string performance
我正在写一个Chrome扩展程序,包括做了很多消毒的字符串:下面的工作可能通过转换包含HTML标签,<
,>
并&
到<
,>
并&
分别.
(换句话说,和PHP一样htmlspecialchars(str, ENT_NOQUOTES)
- 我认为没有必要转换双引号字符.)
这是迄今为止我发现的最快的功能:
function safe_tags(str) {
return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') ;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我必须一次性运行几千个字符串时,仍然存在很大的滞后.
任何人都可以改进吗?它主要用于10到150个字符之间的字符串,如果这有所不同的话.
(我有一个想法是不打扰编码大于号 - 这会有任何真正的危险吗?)
Web*_*ner 92
这是你可以这样做的一种方法:
var escape = document.createElement('textarea');
function escapeHTML(html) {
escape.textContent = html;
return escape.innerHTML;
}
function unescapeHTML(html) {
escape.innerHTML = html;
return escape.textContent;
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ijn 75
您可以尝试传递回调函数来执行替换:
var tagsToReplace = {
'&': '&',
'<': '<',
'>': '>'
};
function replaceTag(tag) {
return tagsToReplace[tag] || tag;
}
function safe_tags_replace(str) {
return str.replace(/[&<>]/g, replaceTag);
}
Run Code Online (Sandbox Code Playgroud)
这是一个性能测试:http://jsperf.com/encode-html-entities与replace
重复调用函数进行比较,并使用Dmitrij提出的DOM方法.
你的方式似乎更快......
但是你为什么需要呢?
Ara*_*yan 27
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>"
Run Code Online (Sandbox Code Playgroud)
Kev*_*son 10
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, '>');
}
Run Code Online (Sandbox Code Playgroud)
最快的方法是:
function escapeHTML(html) {
return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
}
Run Code Online (Sandbox Code Playgroud)
这种方法比基于'replace'的方法快两倍,参见http://jsperf.com/htmlencoderegex/35.
资料来源:https://stackoverflow.com/a/17546215/698168
一体化脚本:
// 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;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
更快或更短的解决方案是:
escaped = new Option(html).innerHTML
Run Code Online (Sandbox Code Playgroud)
这与JavaScript的一些怪异痕迹有关,其中Option元素保留了一个自动进行这种转义的构造函数。
归功于https://github.com/jasonmoo/t.js/blob/master/t.js
归档时间: |
|
查看次数: |
125396 次 |
最近记录: |