首先,我尚且不懂javascript,以下心得,完全是通過學習正則表達式的文檔和實踐得出,
寫該文的目的之一也是試圖消除大家對正則表達式的畏懼心理,從簡單之處先入門。
而這其中必定有貽笑大方之處,懇請高手們斧正!
在看本文之前,我在附件中附上了帶我進入正則表達式之門的一個基礎教程,
和一個“正則表達式的練習器”,建議大家先讀此文并粗略的實踐一下,因為
下面的文字都站在這篇文章的基礎上。
---------------------------------------------------------------------------------------------
通過對正則表達式的文檔的研究,以及對本人Maxthon積累下來的廣告過濾條目對應的url的分析,
我有以下幾點心得:
1.正則表達式的優(yōu)勢,在于高整合度和高精確度,記做到了代碼的簡潔,又疏而不漏,唯一的缺點,不過是
可讀性略差了一點。
2.理論上說,所有的過濾條目都可以用|符號整合到一條正則表達式過濾器里面去,可是這樣既雪上加霜地降低了
可讀性,還不可避免地失去了正則表達式高整合度的優(yōu)勢。所以,為了能寫出好的正則表達式,分析需要匹配的
文本(在這里就是url了)是必不可少的。
*************************************************************************************
我們常見的url無非是:aaa.bbb.ccc/123456789/........htm,gif等等
需要過濾的地址,由抽象到具體來說,往往有以下特點:
I.全部過濾一個不漏,只要出現(xiàn)就喀嚓,往往是令人深惡痛絕的url。
例(例子中都是用原始的帶通配符的表達式):*.ad.*; */ad/*; *.3721.*/*或者*3721*
II.過濾網(wǎng)址主體,也就是第一個/號之前的所有。
例:www.1000downloads.com/*; www.w163.com/*
III.過濾具體到網(wǎng)頁子目錄,進入若干個/號內
例:http://imguv.21cn.com/images/*; http://union.homeway.com.cn/images/*
之所以能這樣,一般是因為一眼看過去就知道這樣的目錄下沒有好東西,或者看到很多條過濾器中
都出現(xiàn)如下的結構(也表明了網(wǎng)頁作者的風格類似),如這里的images
IV.過濾具體到文件,一般就是*.gif,*.swf,*.js類的文件了
例:http://images.chinabyte.com/*.swf; http://www.5ud.com/images/*.gif
綜上,只要把問題分開考慮即可:
**************************************************************************************
1.一段體
創(chuàng)建一個如下的表達式(注:本文的正則表達式如果不帶前后的兩個/號,加入adblock時需加上)
(\.|\/)(您的輸入)(\.|\/|_) (感謝zlowly給出這個filter模型)
前后兩個括號中表示的是在你的字段前出現(xiàn)"."或"/",字段后出現(xiàn)".","/"或"_"時候考慮你的字段,
沒有這兩個限制的話過濾范圍就過寬了,例:只寫(ad)的話,任何帶有ad二字的url均會被過濾。
例:
/(\.|\/)(tomnews|dns99|ad|banner|3721|taobao|unionsky)(s)?(\d)*(\.|\/|_)/
--其中的(s)?是表示s出現(xiàn)0次或1次,則該filter通配ad或者ads,banner或banners,但由于
可以出現(xiàn)0次,所以其他成分仍然可以往中間的括號里加入,即便沒有unionskys,taobaos。
--后面的(\d)*表示0-9之間的數(shù)字,*號表示0次或多次。
正如zlowly所說,為的是對抗網(wǎng)站根據(jù)日期顯示不同廣告,例如
.../ad20041020/...
然后無非是在中間那個括號中,用|號分開你所有想要匹配的字段了。
知道了這一點,后面的情況就勢如破竹了。
2.二段體
創(chuàng)建一個這樣的表達式雛形:
\.()\.()
由于已經(jīng)具體到網(wǎng)址的主體部分,所以前后的/或者.也就不需再出現(xiàn)了
例:
\.(boyis|***|cjt1|w163|ppzxw|1000downloads)\.(net|com)
它等價于
http://*.***.com/*
*.boyis.com*
*.cjt1.net*
*.w163.com*
*.ppzxw.com*
*.1000downloads.com*
這樣看來,應該比較清晰了吧?
3.三段體
例:
(union|adimg|unstat|ulinkjs)\.(baidu|tom|163|sogou)\.(com)
等價于
*adimg.163.com*
*unstat.baidu.com*
*ulinkjs.tom.com*
*union.sogou.com*
或許有朋友問,為什么分開三種情況呢?整合到一起去有沒有可能?
一個很自然的想法是用一個"?"號來表示三段體中的第一段或者出現(xiàn),或者不出現(xiàn),
例如想要整合admig.163.com和*.boyis.com,這樣寫的話:
(adimg)?\.(163|boyis)\.(com)
因為adimg這個字段可出現(xiàn)也可不出現(xiàn),所以實際上www.163.com這樣的地址自然也會被匹配上了,這可不是我們的初衷,
這也就是為什么我覺得應該把各種情況分開考慮,當然更期待高手能解決這個
問題。
其次,鑒于"|"符號會導致自由組合,整合度不應太高。三段體例子中,第一個括號中最好不要放進通用性太強的字段,
如www,否則"|"符號產(chǎn)生自由組合,若要過濾www.ads8.com和adimage.163.com,自由組合的結果當然www.163.com也被過濾了……
有鑒于此,鎖定某一段應該是一個不錯的選擇,我看第三段應該鎖定,也就是說里面沒有“或”符號
例如:結尾為com的全部單獨寫一條,而不要結尾(com|net|org|biz|gov)全加上,
或許會有意想不到的組合的(大家看看whitehouse.com/net/gov就知道了 )
4.具體到文件的,swf/gif類(如有FlashBlock這個擴展的,可以不需要重復過濾swf)
下面是一條很個人的filter,原則也就是在()\.()\.()\/的基本型后面加上了一個.*\.(gif|swf)的文件類型判斷,
鑒于這個時候網(wǎng)站網(wǎng)址變化很大,這個filter的整合度就不高了,很多都是直接貼進去然后用"|"符號分開而已。
(www\.(mydrivers|btbbt|shd|5ud)\.com(\.cn)?|search(\d)?\.btchina\.net|image\.cgame\.cn|
onlinedown\.net|218\.106\.83\.10|down\.20cl\.com)\/(image(s)?|photo)?\/.*\.(gif|swf)
等價于:
http://*.onlinedown.net/*.swf
http://*.onlinedown.net/images/*.gif
http://down.20cl.com/*.gif
http://image.cgame.cn/photo/*.gif
http://search3.btchina.net/images/*.gif
http://www.btbbt.com/*.gif
http://www.shd.com.cn/*.gif
http://www.mydrivers.com/images/*.gif
http://www.mydrivers.com/images/*.swf
http://218.106.83.10/images/*.gif
*****************************************************************************************************************
希望拙作能給大家體會正則表達式的強大、學習使用正則表達式帶來幫助。
在此最有必要感謝的是AdBlock的(作者(們)?)(0次或1次……呵呵),我在AdBlock的設置中也沒找到他(們)?的名字,
網(wǎng)站上也沒找到,對這樣默默無聞的人表示敬佩。
順帶謝謝提供廣告幫助測試AdBlock的所有廣告提供商……
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
26 | 27 | 28 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|
常用鏈接
留言簿(6)
隨筆分類
隨筆檔案
文章檔案
相冊
我關注的文章
我聽的音樂
我瀏覽的網(wǎng)站
我的好友
我看的書
我看社會
搜索
最新評論

閱讀排行榜
評論排行榜
|
|