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 相关文章推荐
科讯商业版中用到的ajax空间与分页函数
Sep 02 Javascript
JS实现可调整倒计时间代码分享
Aug 18 Javascript
js数组与字符串常用方法总结
Jan 13 Javascript
JavaScript中三个等号和两个等号你了解多少
Jul 04 Javascript
关于Stream和Buffer的相互转换详解
Jul 26 Javascript
jquery中done和then的区别(详解)
Dec 19 jQuery
深入理解Vue 的钩子函数
Sep 05 Javascript
在vue中多次调用同一个定义全局变量的实例
Sep 25 Javascript
JavaScript计算正方形面积
Nov 26 Javascript
JavaScript获取当前url路径过程解析
Dec 27 Javascript
详解vue路由
Aug 05 Javascript
JavaScript WeakMap使用详解
Feb 05 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
测试您的 PHP 水平的题目
2007/05/30 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
JS &amp; JQuery 动态添加 select option
2016/06/08 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
使用Bootstrap打造特色进度条效果
2017/05/02 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python 用户登录验证的小例子
2013/03/06 Python
简单介绍Python中的round()方法
2015/05/15 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
导入tensorflow时报错:cannot import name 'abs'的解决
2019/10/10 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
总经理职责范文
2013/11/08 职场文书
哈理工毕业生的求职信
2013/12/22 职场文书
服务之星获奖感言
2014/01/21 职场文书
库房管理员岗位职责
2014/03/09 职场文书
优秀毕业生求职信
2014/06/05 职场文书
三八妇女节标语
2014/10/09 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
材料员岗位职责范本
2015/04/11 职场文书
2015年司法所工作总结
2015/04/27 职场文书
社区敬老月活动总结
2015/05/07 职场文书
员工安全责任协议书
2016/03/22 职场文书
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android
JavaScript中reduce()的用法
2022/05/11 Javascript
JavaScript实现音乐播放器
2022/08/14 Javascript