将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 相关文章推荐
获取URL地址中的文件名和参数的javascript代码
Sep 02 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
Apr 02 Javascript
js调试系列 源码定位与调试[基础篇]
Jun 18 Javascript
JQuery的ON()方法支持的所有事件罗列
Feb 28 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
Jan 05 Javascript
基于jQuery Ajax实现上传文件
Mar 24 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 Javascript
Angular.js跨controller实现参数传递的两种方法
Feb 20 Javascript
jQuery中table数据的值拷贝和拆分
Mar 19 Javascript
Vue.js如何实现路由懒加载浅析
Aug 14 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
Aug 23 Javascript
Vue.js实现数据响应的方法
Aug 13 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中养成7个面向对象的好习惯
2010/07/17 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
在网页里看flash的trace数据的js类
2009/01/10 Javascript
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
Javascript缓存API
2016/06/14 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
JS ES6多行字符串与连接字符串的表示方法
2017/04/26 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
Python 去除字符串中指定字符串
2020/03/05 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
即兴演讲稿
2014/01/04 职场文书
新学期决心书
2014/03/11 职场文书
开业典礼主持词
2014/03/21 职场文书
面试通知短信
2015/04/20 职场文书
2015年幼儿园德育工作总结
2015/05/25 职场文书
年终工作总结范文
2019/06/20 职场文书
python tkinter模块的简单使用
2021/04/07 Python
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
Java实现聊天机器人完善版
2021/07/04 Java/Android
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js