Prototype源碼淺析 String部分(三)之HTML字符串處理
更新時(shí)間:2012年01月15日 22:40:01 作者:
現(xiàn)在,String部分轉(zhuǎn)入具體的關(guān)聯(lián)應(yīng)用,分別對(duì)應(yīng)HTML字符串,JSON字符串和HTML中的腳本字符串
| HTML處理 | stripTags | escapeHTML | unescapeHTML |
| JSON處理 | unfilterJSON | isJSON | evalJSON | parseJSON |
| 腳本處理 | stripScripts | extractScripts | evalScripts |
HTML字符串,JSON字符串和HTML中的腳本字符串。
【亂入一句,有關(guān)JSON的一點(diǎn)東西,可以看看http://www.cnblogs.com/TomXu/archive/2012/01/11/2311956.html】
下面分別敘述:
一、HTML字符串
stripTags :移除字符串中所有的 HTML 標(biāo)簽。
escapeHTML : 將 HTML 特殊字符轉(zhuǎn)換為它們的等價(jià)實(shí)體。(&對(duì)應(yīng)& <對(duì)應(yīng)< >對(duì)應(yīng)> )
unescapeHTML :移除字符串中的標(biāo)簽,并將用實(shí)體表示的 HTML 特殊字符轉(zhuǎn)換為它們的正常形式。(escapeHTML 的逆操作)
stripTags 中的一段正則/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi用來(lái)匹配標(biāo)簽中的內(nèi)容,注意不能換行,不過(guò)換行的話就有語(yǔ)法錯(cuò)誤了。
【這個(gè)方法唯一需要注意的位置是,stripTags會(huì)移除<script>標(biāo)簽,但是不會(huì)移除里面的內(nèi)容,所以可能將<script>里面的內(nèi)容暴露出來(lái),影響頁(yè)面結(jié)構(gòu)】
二、腳本字符串
stripScripts : 移除字符串中所有的 HTML script 塊。彌補(bǔ)stripTags方法對(duì)script標(biāo)簽的缺陷
extractScripts :提取出字符串中包含的所有 script 的內(nèi)容,并將之返回作為一個(gè)字符串?dāng)?shù)組。
evalScripts :執(zhí)行字符串中包含的所有 script 塊的內(nèi)容。返回一個(gè)數(shù)組,該數(shù)組包含每個(gè) script 執(zhí)行后返回的值。
stripScripts中的正則是對(duì)stripTags中一個(gè)正則的發(fā)展
復(fù)制代碼 代碼如下:
function stripScripts() {
var pattern = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'img');//i忽略大小寫,m換行,g全局
return this.replace(pattern , '');
}
復(fù)制代碼 代碼如下:
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是對(duì)數(shù)組的一個(gè)擴(kuò)展,某些瀏覽器有這個(gè)原生方法,參見(jiàn)《chrome原生方法之?dāng)?shù)組》
最后獲得的是一個(gè)所有script標(biāo)簽內(nèi)部?jī)?nèi)容的一個(gè)數(shù)組,因此evalScripts 的做法就很自然的可以想出來(lái)——循環(huán)遍歷獲得的數(shù)組,然后依次執(zhí)行(eval),存儲(chǔ)每一項(xiàng)執(zhí)行的結(jié)果。
復(fù)制代碼 代碼如下:
function evalScripts() {
return this.extractScripts().map(function(script) { return eval(script) });
}
三、JSON處理
unfilterJSON:移除 Ajax JSON 或 JavaScript 響應(yīng)內(nèi)容周圍的安全注釋界定符。
isJSON:使用正則表達(dá)式檢測(cè)字符串是否是合法的 JSON 格式
evalJSON:執(zhí)行一個(gè) JSON 格式的字符串,并返回結(jié)果對(duì)象
其中isJSON和evalJSON就是JSON.js中的parseJSON,而且代碼也差不多,參見(jiàn)《從字符串中解析出JSON》
順便說(shuō)一點(diǎn)unfilterJSON中的安全注釋界定符,這是一種安全機(jī)制,對(duì)于自家的數(shù)據(jù),可以在返回值兩端加上特殊的字符(界定符)來(lái)表明數(shù)據(jù)的來(lái)源,客戶端解析的時(shí)候用unfilterJSON來(lái)處理掉添加的界定符,借此可以在一定程度上減少一些XSS的攻擊。
Prototype中默認(rèn)的形式是:
'/*-secure-\n{"name": "小西山子","age": 24}\n*/'
其中界定符號(hào)是 /*-secure-\n'和'\n*/'
相關(guān)文章
Prototype源碼淺析 String部分(三)之HTML字符串處理
現(xiàn)在,String部分轉(zhuǎn)入具體的關(guān)聯(lián)應(yīng)用,分別對(duì)應(yīng)HTML字符串,JSON字符串和HTML中的腳本字符串2012-01-01
Prototype String對(duì)象 學(xué)習(xí)
這個(gè)對(duì)象里面的方法就是提供了一些字符串操作的工具方法,比較重要的gsub方法,下面做了詳細(xì)的注釋,簡(jiǎn)單的方法就不說(shuō)了,一看就明白了。2009-07-07
Prototype源碼淺析 String部分(一)之有關(guān)indexOf優(yōu)化
Prototype源碼淺析 String部分(一)之有關(guān)indexOf優(yōu)化介紹,需要的朋友可以參考下。2012-01-01
初學(xué)prototype,發(fā)個(gè)JS接受URL參數(shù)的代碼
初學(xué)prototype,發(fā)個(gè)JS接受URL參數(shù)的代碼...2006-09-09
Prototype Date對(duì)象 學(xué)習(xí)
這個(gè)對(duì)象里面就一個(gè)toJSON方法,非常簡(jiǎn)單2009-07-07
Prototype Hash對(duì)象 學(xué)習(xí)
這個(gè)對(duì)象相當(dāng)于Java中的HashMap,當(dāng)然了功能沒(méi)HashMap那么強(qiáng)大。提供一直基本的方法,簡(jiǎn)單的方法就不在源碼中注釋了。2009-07-07

