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














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*/'

时间: 2012-01-14

Prototype源码浅析 String部分(四)之补充

替换 interpolate  | sub |  scan |  truncate | gsubinterpolate : 将字符串看作一个模板,并使用 object 的属性填充它. sub : 将字符串中前指定个个与 pattern 指定的模式匹配的子串用 replacement 替换 scan : 遍历字符串中与参数 pattern 指定的模式匹配的所有子串.返回原始字符串本身. truncate : 将字符串截短为指定的长度(包含后缀部分), 并添加一个后缀. gsub :将字符串中所有与

Prototype源码浅析 String部分(一)之有关indexOf优化

添加到String.prototype中的方法比较多,不过归结起来,大致分为下面几类: 分类 方法名  原始能力增强               strip |  include  |  startsWith  |  endsWith |  empty |  blank 格式 camelize | capitalize |  underscore |  dasherize  | inspect           变形 toArray |  succ  | times 替换 interpolat

Prototype源码浅析 Number部分

Number部分方法比较少,一共有8个: toColorPart: 将 Number 对象转换为具有两位数字的十六进制形式 succ: 返回当前 Number 对象的下一个值,即当前值加一 times: 采用 Ruby 的风格来封装一个标准的 [0...n] 循环 toPaddedString:将当前 Number 对象转换为字符串,如果转换后的字符串长度小于 length 指定的值,则用 0 在左边补足其余的位数 abs: 返回当前 Number 对象的绝对值. round: 返回当前 Num

Prototype源码浅析 String部分(二)

格式 camelize | capitalize |  underscore |  dasherize  | inspect           变形 toArray |  succ  | times这里面一个有用的方法是inspect,按照参考手册的说明,他的作用是"返回该字符串针对调试的字符串表现形式(即用单引号或双引号包括起来,并使用 '\' 对特殊字符进行转义)",在Object的toJSON里面也涉及到这个方法. 既然涉及到需要转义的字符,我们自然要一份转义字符信息,下面直接

Prototype源码浅析 Enumerable部分(二)

前面each方法中掉了一个方面没有说,就是源码中的$break和$continue.这两个变量是预定义的,其作用相当于普通循环里面的break和continue语句的作用.出于效率的考虑,在某些操作中并不需要完全遍历一个集合(不局限于一个数组),所以break和continue还是很必要的. 对于一个循环来说,对比下面几种退出循环的方式: 复制代码 代码如下: var array_1 = [1,2,3]; var array_2 = ['a','b','c']; (function(){ for

Prototype源码浅析 Enumerable部分之each方法

在javascript中,根本找不到Enumerable的影子,因为这一块是Prototype作者从Ruby中借鉴过来的.并且Enumerable在实际中根本没有直接应用的机会,都是混入到其他的对象中,可以说是其他对象的一个"父类"(不过只是调用了Object的extend方法,进行了方法的直接拷贝而已). 我并不熟悉Ruby,不过看Enumerable中的一些方法,倒是跟Python中的有几分相似. Enumerable其中一个最重要的方法是each,each这个方法应该都比较熟悉,

Ajax::prototype 源码解读

AJAX之旅(1):由prototype_1.3.1进入javascript殿堂-类的初探  还是决定冠上ajax的头衔,毕竟很多人会用这个关键词搜索.虽然我认为这只是个炒作的概念,不过不得不承认ajax叫起来要方便多了.所以ajax的意思我就不详细解释了. 写这个教程的起因很简单:经过一段时间的ajax学习,有一些体会,并且越发认识到ajax技术的强大,所以决定记录下来,顺便也是对自己思路的整理.有关这个教程的后续,请关注http://www.x2design.net 前几年,javascri

[转]prototype 源码解读 超强推荐第1/3页

复制代码 代码如下: Prototype is a JavaScript framework that aims to ease development of dynamic web applications. Featuring a unique, easy-to-use toolkit for class-driven development and the nicest Ajax library around, Prototype is quickly becoming the codeb

java String源码和String常量池的全面解析

1. String 介绍,常用方法源码分析 2. String 常量池分析 常用方法 equals trim replace concat split startsWith 和 endsWith substring toUpperCase() 和 toLowerCase() compareTo String 介绍 String类被final所修饰,也就是说String对象是不可变量,并发程序最喜欢不可变量了.String类实现了Serializable, Comparable, CharSequ