Prototype源码浅析 String部分(三)之HTML字符串处理


Posted in Javascript onJanuary 15, 2012
HTML处理 stripTags  | escapeHTML |  unescapeHTML
   
JSON处理 unfilterJSON |  isJSON |  evalJSON |  parseJSON
脚本处理 stripScripts |  extractScripts  | evalScripts
现在,String部分转入具体的关联应用,分别对应
HTML字符串,JSON字符串和HTML中的脚本字符串。
【乱入一句,有关JSON的一点东西,可以看看http://www.cnblogs.com/TomXu/archive/2012/01/11/2311956.html】
下面分别叙述:
一、HTML字符串
stripTags :移除字符串中所有的 HTML 标签。
escapeHTML : 将 HTML 特殊字符转换为它们的等价实体。(&对应& <对应< >对应> )
unescapeHTML :移除字符串中的标签,并将用实体表示的 HTML 特殊字符转换为它们的正常形式。(escapeHTML 的逆操作)
stripTags 中的一段正则/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi用来匹配标签中的内容,注意不能换行,不过换行的话就有语法错误了。
【这个方法唯一需要注意的位置是,stripTags会移除<script>标签,但是不会移除里面的内容,所以可能将<script>里面的内容暴露出来,影响页面结构】
二、脚本字符串
stripScripts : 移除字符串中所有的 HTML script 块。弥补stripTags方法对script标签的缺陷
extractScripts :提取出字符串中包含的所有 script 的内容,并将之返回作为一个字符串数组。
evalScripts :执行字符串中包含的所有 script 块的内容。返回一个数组,该数组包含每个 script 执行后返回的值。
stripScripts中的正则是对stripTags中一个正则的发展
function stripScripts() { 
var pattern = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'img');//i忽略大小写,m换行,g全局 
return this.replace(pattern , ''); 
}

function extractScripts() { 
var matchAll = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'img'), 
matchOne = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'im'); 
return (this.match(matchAll) || []).map(function(scriptTag) { 
return (scriptTag.match(matchOne) || ['', ''])[1]; 
}); 
}

map是对数组的一个扩展,某些浏览器有这个原生方法,参见《chrome原生方法之数组》
最后获得的是一个所有script标签内部内容的一个数组,因此evalScripts 的做法就很自然的可以想出来——循环遍历获得的数组,然后依次执行(eval),存储每一项执行的结果。
function evalScripts() { 
return this.extractScripts().map(function(script) { return eval(script) }); 
}

三、JSON处理
unfilterJSON:移除 Ajax JSON 或 JavaScript 响应内容周围的安全注释界定符。
isJSON:使用正则表达式检测字符串是否是合法的 JSON 格式
evalJSON:执行一个 JSON 格式的字符串,并返回结果对象
其中isJSON和evalJSON就是JSON.js中的parseJSON,而且代码也差不多,参见《从字符串中解析出JSON》
顺便说一点unfilterJSON中的安全注释界定符,这是一种安全机制,对于自家的数据,可以在返回值两端加上特殊的字符(界定符)来表明数据的来源,客户端解析的时候用unfilterJSON来处理掉添加的界定符,借此可以在一定程度上减少一些XSS的攻击。
Prototype中默认的形式是:
'/*-secure-\n{"name": "小西山子","age": 24}\n*/'
其中界定符号是 /*-secure-\n'和'\n*/'
Javascript 相关文章推荐
基于JQuery的简单实现折叠菜单代码
Sep 15 Javascript
将两个div左右并列显示并实现点击标题切换内容
Oct 22 Javascript
JavaScript 32位整型无符号操作示例
Dec 08 Javascript
禁用Tab键JS代码兼容Firefox和IE
Apr 18 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
Jun 12 Javascript
Javascript生成带参数的二维码示例
Oct 10 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
Dec 02 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
Dec 28 Javascript
vue-lazyload图片延迟加载插件的实例讲解
Feb 09 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
Sep 06 Javascript
小程序接入腾讯位置服务的详细流程
Mar 03 Javascript
关于element-ui表单中限制输入纯数字的解决方式
Sep 08 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
Jan 15 #Javascript
用js小类库获取浏览器的高度和宽度信息
Jan 15 #Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
Jan 15 #Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
Jan 13 #Javascript
20个最新的jQuery插件
Jan 13 #Javascript
JSON 数据格式介绍
Jan 13 #Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
Jan 13 #Javascript
You might like
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
PHP中overload与override的区别
2017/02/13 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
细品javascript 寻址,闭包,对象模型和相关问题
2009/04/27 Javascript
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
为Extjs加加速(javascript加速)
2010/08/19 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python书籍信息爬虫实例
2018/03/19 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
迎国庆演讲稿
2014/09/05 职场文书
简单租房协议书
2014/10/21 职场文书
工厂见习报告范文
2014/10/31 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书