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

2022-08-30 05:39:58

我正在编写一个Chrome扩展程序,涉及完成以下许多工作:通过分别将 和 转换为 和 和 来清理可能包含 HTML 标记的字符串。<>&&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个字符之间的字符串,如果这有所作为的话。

(我的一个想法是不要费心对大于号进行编码 - 这会带来任何真正的危险吗?


答案 1

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

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

function unescapeHTML(html) {
    escape.innerHTML = html;
    return escape.textContent;
}

下面是一个演示。


答案 2

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

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 与重复调用函数进行比较,并使用Dmitrij提出的DOM方法。replace

你的方式似乎更快...

但是,为什么需要它呢?