由于xss防御机制,将标点符号转换成字符实体。
定义方法转换几个常用的字符
const entityMap = {
escape: {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''',
} as any,
unescape: {
'&': "&",
''': "'",
'>': ">",
'<': "<",
'"': '"',
} as any,
};
const entityReg = {
escape: RegExp('[' + Object.keys(entityMap.escape).join('') + ']', 'g'),
unescape: RegExp('(' + Object.keys(entityMap.unescape).join('|') + ')', 'g')
};
/** 判断字符串是否可以转为对象 */
function isValidJsonString(str: string) {
try {
const obj = JSON.parse(str);
return obj;
} catch (error) {
return str;
}
};
// 将HTML转义为实体
export function escapeEntity(html: string) {
if (typeof html !== 'string') return ''
return html.replace(entityReg.escape, function (match) {
return entityMap.escape[match];
})
}
// 将实体转回为HTML
export function unescapeEntity(str: string) {
if (typeof str !== 'string') return ''
const new_str = str.replace(entityReg.unescape, function (match) {
return entityMap.unescape[match];
});
return isValidJsonString(new_str);
}