将HTML的左右尖括号等转义成实体形式的两种实现方式


Posted in Javascript onMay 04, 2014

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

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

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

这里提供两个函数escape和unescape,分别实现将HTML转义为实体和回转。

方式一、一个映射表+正则替换

var keys = Object.keys || function(obj) { 
obj = Object(obj) 
var arr = [] 
for (var a in obj) arr.push(a) 
return arr 
} 
var invert = function(obj) { 
obj = Object(obj) 
var result = {} 
for (var a in obj) result[obj[a]] = a 
return result 
} 
var entityMap = { 
escape: { 
'&': '&', 
'<': '<', 
'>': '>', 
'"': '"', 
"'": ''' 
} 
} 
entityMap.unescape = invert(entityMap.escape) 
var entityReg = { 
escape: RegExp('[' + keys(entityMap.escape).join('') + ']', 'g'), 
unescape: RegExp('(' + keys(entityMap.unescape).join('|') + ')', 'g') 
} // 将HTML转义为实体 
function escape(html) { 
if (typeof html !== 'string') return '' 
return html.replace(entityReg.escape, function(match) { 
return entityMap.escape[match] 
}) 
} 
// 将实体转回为HTML 
function unescape(str) { 
if (typeof str !== 'string') return '' 
return str.replace(entityReg.unescape, function(match) { 
return entityMap.unescape[match] 
}) 
}

方式二、利用浏览器DOM API
// 将HTML转义为实体 
function escape(html){ 
var elem = document.createElement('div') 
var txt = document.createTextNode(html) 
elem.appendChild(txt) 
return elem.innerHTML; 
} 
// 将实体转回为HTML 
function unescape(str) { 
var elem = document.createElement('div') 
elem.innerHTML = str 
return elem.innerText || elem.textContent 
}

有个缺陷是只能转义“< > & ”,对于单引号,双引号都不转义。另外一些非ASCII也不能转义。选择时须注意。

比较:

方式1 代码量较大,但灵活性,完整性都比方式2强。可根据需求添加或减少映射表entityMap,且可以运行在任意JS环境中。

方式2 为hack方式,代码量少很多,利用浏览器内部API就行了转义和转回(主流浏览器都支持)。不具完整性,很明显只能在浏览器环境中使用(比如不能在Node.js中跑)。

Javascript 相关文章推荐
菜鸟javascript基础资料整理2
Dec 06 Javascript
Jquery 绑定时间实现代码
May 03 Javascript
DIV外区域Click后关闭DIV的实现代码
Dec 21 Javascript
js键盘事件的keyCode
Jul 29 Javascript
node.js中的fs.truncate方法使用说明
Dec 15 Javascript
jQuery+ajax实现动态执行脚本的方法
Jan 27 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
Apr 01 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
Jun 08 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
Mar 24 jQuery
详解Vue.js中.native修饰符
Apr 24 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
Sep 14 Javascript
在vue中axios设置timeout超时的操作
Sep 04 Javascript
IE6-8中Date不支持toISOString的修复方法
May 04 #Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 #Javascript
JavaScript获取图片的原始尺寸以宽度为例
May 04 #Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
May 04 #Javascript
使用JavaScript获取电池状态的方法
May 03 #Javascript
JavaScript打印网页指定区域的例子
May 03 #Javascript
js检测输入内容全为空格的方法
May 03 #Javascript
You might like
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
PHP5.5迭代生成器用法实例详解
2016/03/16 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
JS数组array元素的添加和删除方法代码实例
2015/06/01 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
2017/10/09 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
小程序实现五星点评效果
2018/11/03 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
Python获取当前路径实现代码
2017/05/08 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
python默认参数调用方法解析
2020/02/09 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
会计专业应届生自荐信
2014/02/07 职场文书
会计专业自我鉴定
2014/02/10 职场文书
我的小天地教学反思
2014/04/30 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python