是否有使用 JavaScript 或 ES6 编码或解码 HTML 实体的本机方法?例如,
<
将被编码为 <
。 Node.js 有像 html-entities
这样的库,但感觉 JavaScript 中应该内置一些东西来满足这种常见需求。
使用 es6 转义 html 的好函数:
const escapeHTML = str => str.replace(/[&<>'"]/g,
tag => ({
'&': '&',
'<': '<',
'>': '>',
"'": ''',
'"': '"'
}[tag]));
对于没有库的纯 JS,您可以使用纯 Javascript 编码和解码 HTML 实体,如下所示:
let encode = str => {
let buf = [];
for (var i = str.length - 1; i >= 0; i--) {
buf.unshift(['&#', str[i].charCodeAt(), ';'].join(''));
}
return buf.join('');
}
let decode = str => {
return str.replace(/&#(\d+);/g, function(match, dec) {
return String.fromCharCode(dec);
});
}
用法:
encode("Hello > © <") // "Hello > © <"
decode("Hello > © © <") // "Hello > © © <"
但是,您可以看到这种方法有几个缺点:
H
→ H
>
用法:
he.encode('foo © bar ≠ baz 𝌆 qux');
// Output : 'foo © bar ≠ baz 𝌆 qux'
he.decode('foo © bar ≠ baz 𝌆 qux');
// Output : 'foo © bar ≠ baz 𝌆 qux'
unescape
HTML 实体,您的浏览器很智能,会为您做这件事
方式1
_unescape(html: string) :string {
const divElement = document.createElement("div");
divElement.innerHTML = html;
return divElement.textContent || tmp.innerText || "";
}
方式2
_unescape(html: string) :string {
let returnText = html;
returnText = returnText.replace(/ /gi, " ");
returnText = returnText.replace(/&/gi, "&");
returnText = returnText.replace(/"/gi, `"`);
returnText = returnText.replace(/</gi, "<");
returnText = returnText.replace(/>/gi, ">");
return returnText;
}
您还可以使用
underscore 或 lodash 的 unescape 方法,但这会忽略
并仅处理
&
、
<
、
>
、
"
和
'
字符。
const decodeEscapedHTML = (str) =>
str.replace(
/&(\D+);/gi,
(tag) =>
({
'&': '&',
'<': '<',
'>': '>',
''': "'",
'"': '"',
}[tag]),
)
function encodeHtml(str) {
let buf = [];
for (var i = str.length - 1; i >= 0; i--) {
if (!(/^[a-zA-Z0-9]$/.test(str[i])))
buf.unshift(['&#', str[i].charCodeAt(), ';'].join(''));
else
buf.unshift(str[i])
}
return buf.join('');
}
HTML解码功能
function decodeHtml(str) {
return str.replace(/&#(\d+);/g, function(match, dec) {
return String.fromCharCode(dec);
});
}