将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 相关文章推荐
Add a Formatted Table to a Word Document
Jun 15 Javascript
JavaScript开发规范要求(规范化代码)
Aug 16 Javascript
jquery isEmptyObject判断是否为空对象的函数
Feb 14 Javascript
三个js循环的关键字示例(for与while)
Feb 16 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
Dec 21 Javascript
微信小程序 swiper制作tab切换实现附源码
Jan 21 Javascript
JS仿Base.js实现的继承示例
Apr 07 Javascript
jQuery实现按比例缩放图片的方法
Apr 29 jQuery
JS中的Replace()传入函数时的用法详解
Sep 11 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
Mar 19 Javascript
vue中提示$index is not defined错误的解决方式
Sep 02 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中copy on write写时复制机制介绍
2014/05/13 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
python读取Excel实例详解
2018/08/17 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
美国乡村商店:Plow & Hearth
2016/09/12 全球购物
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
JVM是一个编译程序还是解释程序
2012/09/11 面试题
大学军训感想
2014/02/12 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
平安工地汇报材料
2014/08/19 职场文书
团代会开幕词
2015/01/28 职场文书
廉洁自律个人总结
2015/02/14 职场文书
销售员自我评价
2015/03/11 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
学会感恩主题班会
2015/08/12 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫
VUE递归树形实现多级列表
2022/07/15 Vue.js