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 相关文章推荐
支持ie与FireFox的剪切板操作代码
Sep 28 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
Feb 21 Javascript
javascript实现playfair和hill密码算法
Dec 07 Javascript
JS实现自适应高度表单文本框的方法
Feb 25 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
Sep 15 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
Dec 25 Javascript
第五章之BootStrap 栅格系统
Apr 25 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
vuejs使用FormData实现ajax上传图片文件
Aug 08 Javascript
详解VueJs中的V-bind指令
May 03 Javascript
JS跨域请求的问题解析
Dec 03 Javascript
vue回到顶部监听滚动事件详解
Aug 02 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下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
JS实现为排序好的字符串找出重复行的方法
2016/03/02 Javascript
KnockoutJS 3.X API 第四章之click绑定
2016/10/10 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
微信小程序 出现错误:{&quot;baseresponse&quot;:{&quot;errcode&quot;:-80002,&quot;errmsg&quot;:&quot;&quot;}}解决办法
2017/02/23 Javascript
nodejs读写json文件的简单方法(必看)
2017/03/09 NodeJs
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
package.json文件配置详解
2017/06/15 Javascript
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
Python if语句知识点用法总结
2018/06/10 Python
python读取各种文件数据方法解析
2018/12/29 Python
python解析xml简单示例
2019/06/21 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
python怎么对数字进行过滤
2020/07/05 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
大学生职业生涯规划大赛作品(精品)
2014/09/17 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
婚宴致辞
2015/07/28 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python
手把手教你导入Go语言第三方库
2021/08/04 Golang
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android