将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之卸载鼠标事件的代码
May 14 Javascript
精选的10款用于构建良好易用性网站的jQuery插件
Jan 23 Javascript
checkbox全选所涉及到的知识点介绍
Dec 31 Javascript
JavaScript列表框listbox全选和反选的实现方法
Mar 18 Javascript
JS动画效果打开、关闭层的实现方法
May 09 Javascript
JS实现的不规则TAB选项卡效果代码
Sep 18 Javascript
详解JavaScript中的事件流和事件处理程序
May 20 Javascript
html中通过JS获取JSON数据并加载的方法
Nov 30 Javascript
jQuery实现标签子元素的添加和赋值方法
Feb 24 jQuery
Vue中使用clipboard实现复制功能
Sep 05 Javascript
webpack之引入图片的实现及问题
Oct 08 Javascript
node中使用es6/7/8(支持性与性能)
Mar 28 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
亚洲咖啡有什么?亚洲咖啡产地介绍 亚洲咖啡有什么特点?
2021/03/05 新手入门
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
php compact 通过变量创建数组
2016/11/15 PHP
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
[01:12:40]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第三场 1月25日
2021/03/11 DOTA
Python的Flask框架中配置多个子域名的方法讲解
2016/06/07 Python
Python判断某个用户对某个文件的权限
2016/10/13 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
Python对象的属性访问过程详解
2020/03/05 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
纪律教育学习月活动总结
2014/08/27 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
个人维稳承诺书
2015/05/04 职场文书
刑事上诉状范文
2015/05/22 职场文书
花木兰观后感
2015/06/10 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
基于Python实现西西成语接龙小助手
2022/08/05 Golang