问题描述
我花了一些时间寻找逃避html字符串的最佳方法并找到了一些讨论: 。它引导我功能。然后我进行了性能测试并试图找到达到类似速度但没有成功的解决方案:(
I spent some time looking best way to escape html string and found some discussions on that: discussion 1 discussion 2. It leads me to replaceAll function. Then I did performance tests and tried to find solution achieving similar speed with no success :(
这是我的最终。我在网上找到它并随着我的尝试扩展(底部有4个案例)但仍然无法达到 replaceAll()
表现。
Here is my final test case set. I found it on net and expand with my tries (4 cases at bottom) and still can not reach replaceAll()
performance.
什么秘密女巫 replaceAll()
解决方案如此迅速?
What is secret witch makes replaceAll()
solution so speedy?
Greets!
代码段:
String.prototype.replaceAll = function(str1, str2, ignore)
{
return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
};
目前为止最快的案例:
Fastest case so far:
html.replaceAll('&', '&').replaceAll('"', '"').replaceAll("'", ''').replaceAll('<', '<').replaceAll('>', '>');
推荐答案
最后我发现了!
感谢指向jsperf特定的
Finally i found it!Thanks Jack for pointing me on jsperf specific
答案是:
replaceAll
- 这达到jsperf限制/错误,由特殊序列<$引起c $ c>\\ $&,结果出错了。
replaceAll
- this reach jsperf limit/bug, caused by special sequence "\\$&"
, so results was wrong.
compile()
- 在没有参数的情况下调用它会将regexp定义更改为 /(?:)
。我不知道它是否是bug或其他东西,但是在调用之后性能结果很糟糕。
compile()
- when called with no argument it changes regexp definition to /(?:)
. I dont know if it is bug or something, but performance result was crappy after it was called.
这是我的。
最后我准备了。
结果是,HTML转义最好的方式是使用原生DOM基于解决方案,如:
The result is, that for HTML escape best way it to use native DOM based solution, like:
document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML
或者如果你重复多次,你可以用一次准备好的变量来做到这一点:
or if you repeat it many times you can do it with once prepared variables:
//prepare variables
var DOMtext = document.createTextNode("test");
var DOMnative = document.createElement("span");
DOMnative.appendChild(DOMtext);
//main work for each case
function HTMLescape(html){
DOMtext.nodeValue = html;
return DOMnative.innerHTML
}
谢谢大家的合作&发表评论和指示。
Thank you all for collaboration & posting comments and directions.
jsperf错误描述
jsperf bug description
String.prototype.replaceAll
定义如下:
function (str1, str2, ignore) {
return this.replace(new RegExp(str1.replace(repAll, "\\#{setup}"), (ignore ? "gi" : "g")), (typeof(str2) == "string") ? str2.replace(/\$/g, "$$") : str2);
}
这篇关于什么是替换性能秘密? [HTML转义]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!