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 相关文章推荐
Javascript 匿名函数及其代码模式原理
Mar 19 Javascript
jquery滚动特效集锦
Jun 03 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
Dec 09 Javascript
js实现登录验证码
Dec 22 Javascript
Vue实战之vue登录验证的实现代码
Oct 31 Javascript
vue.js简单配置axios的方法详解
Dec 13 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
Dec 26 Javascript
vue-cli 目录结构详细讲解总结
Jan 15 Javascript
浅谈JS中this在各个场景下的指向
Aug 14 Javascript
vue+elementUI实现图片上传功能
Aug 20 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
Jun 02 Javascript
通过实例解析javascript Date对象属性及方法
Nov 04 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常用函数 推荐收藏保存
2010/02/21 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
php正则匹配html中带class的div并选取其中内容的方法
2015/01/13 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
2013/10/24 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
JavaScript制作弹出层效果
2016/12/02 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
vue3中轻松实现switch功能组件的全过程
2021/01/07 Vue.js
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
python读取和保存图片5种方法对比
2018/09/12 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
违反工作纪律检讨书
2014/02/15 职场文书
《三袋麦子》教学反思
2014/03/02 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
超市采购员岗位职责
2015/04/07 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python