解读:将HTML特殊转义为实体字符的方式

解读:将HTML特殊转义为实体字符的方式

为什么?

​ 前端开发工作中,经常需要将HTML的左右尖括号等转义成实体形式。我们不能把<,>,&等直接显示在最终看到的网页里。需要将其转义后才能在网页上显示。

​ 转义字符(Escape Sequence)也称字符实体(Character Entity)。定义转义字符串的主要原因是

  1. “<”和“>”等符号已经用来表示HTML TAG,因此不能直接当作文本中的符号来使用。但有时需求是在HTML页面上使用这些符号,所以需要定义它的转义字符串。
  2. 有些字符在ASCII字符集中没有定义(如版权符号“©”)。因此需要使用转义字符(“©”对应的转义字符是“©”)来表示。

举例:

​ 比如我想在页面中显示<div>a</div>,但是实际上在这个id为html的行内文本中,只会显示a.在实际开发中万一遇到类似情况,如果你给一个输入框给用户输入东西,然后把这个东西再重新显示出来,多见于评论系统,你能够保证用户不会输入<div>a</div>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>text</title>
</head>
 
<body>
<span id="html"><div>a</div></span>
</body>
</html>

转码函数:

​ 上述情况的发生,可以运用到转码函数解决。

// 该函数把特殊符号的对象entityMap依次遍历并且存在一个数组里面
var keys = Object.keys || function (obj) {
    obj = Object(obj)
    var arr = []
    for (var a in obj) arr.push(a)
    return arr
}
// 该函数是把特殊符号和转义后的字符进行反转。
// 比如说原来是'&': '&amp;'对应,现在是'&amp;': '&'对应
var invert = function (obj) {
    obj = Object(obj)
    var result = {}
    for (var a in obj) result[obj[a]] = a
    return result
}
// 把特殊符号和转移后的字符一一对应起来并且存在对象里面
var entityMap = {
    escape: {
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;',
        '"': '&quot;',
        ' ': '&nbsp;',
        /*
        如果你之后的WEB程序还涉及到文件名,文件的操作,比如导入导出功能,你最好还是在这个映射表中再添加以下的规则,把半角转成全角,否则可能出错
        '\\' : '\',
        '/' : '/',
        ':' : ':',
        '*' : '*',
        '?' : '?',
        '|' : '|',
        */
    }
}
// 把特殊符号和转义后的字符进行反转后以unescape作为关键字存在entityMap中
entityMap.unescape = invert(entityMap.escape);

var entityReg = {
    escape: RegExp('[' + keys(entityMap.escape).join('') + ']', 'g'),
    unescape: RegExp('(' + keys(entityMap.unescape).join('|') + ')', 'g')
}
// 将HTML转义为实体
function HTMLescape(html) {
    if (typeof html != 'string') return ''
    return html.replace(entityReg.escape, function (match) {
        return entityMap.escape[match]
    })
}
// 将实体转回为HTML
function HTMLunescape(str) {
    if (typeof str != 'string') return ''
    return str.replace(entityReg.unescape, function (match) {
        return entityMap.unescape[match]
    })
}

调用函数:

var a="<div>a</div>";
document.getElementById("html").innerHTML=a;
alert(a);
//把转义之后的字符串,替代原来的字符串,再显示
a=HTMLescape(a);
alert(a);
document.getElementById("html").innerHTML=a;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值