請問有相關教學文章 可以看嗎 (台灣版的)
對面的論壇有一篇精華文章
*************************************************************
我們常見的url無非是:aaa.bbb.ccc/123456789/........htm,gif等等
需要過濾的地址,由抽象到具體來說,往往有以下特點:
I.全部過濾一個不漏,只要出現就喀嚓,往往是令人深惡痛絕的url。
例(例子中都是用原始的帶通配符的表達式):*.ad.*; */ad/*; *.3721.*/*或者*3721*
II.過濾網址主體,也就是第一個/號之前的所有。
例:www.1000downloads.com/*;
www.w163.com/*
III.過濾具體到網頁子目錄,進入若干個/號內
例:http://imguv.21cn.com/images/*;
http://union.homeway.com.cn/images/*
之所以能這樣,一般是因為一眼看過去就知道這樣的目錄下沒有好東西,或者看到很多條過濾器中都出現如下的結構(也表明了網頁作者的風格類似),如這裡的images
IV.過濾具體到文件,一般就是*.gif,*.swf,*.js類的文件了
例:http://images.chinabyte.com/*.swf;
http://www.5ud.com/images/*.gif
綜上,只要把問題分開考慮即可:
*************************************************************
1.一段體
創建一個如下的表達式(註:本文的正則表達式如果不帶前後的兩個/號,加入adblock時需加上)
(\.|\/)(您的輸入)(\.|\/|_) (感謝zlowly給出這個filter模型)
前後兩個括號中表示的是在你的字段前出現"."或"/",字段後出現".","/"或"_"時候考慮你的字段,沒有這兩個限制的話過濾範圍就過寬了,例:只寫(ad)的話,任何帶有ad二字的url均會被過濾。
例:
/(\.|\/)(tomnews|dns99|ad|banner|3721|taobao|unionsky)(s)?(\d)*(\.|\/|_)/
--其中的(s)?是表示s出現0次或1次,則該filter通配ad或者ads,banner或banners,但由於可以出現0次,所以其他成分仍然可以往中間的括號裡加入,即便沒有unionskys,taobaos。
--後面的(\d)*表示0-9之間的數字,*號表示0次或多次。
正如zlowly所說,為的是對抗網站根據日期顯示不同廣告,例如
.../ad20041020/...
然後無非是在中間那個括號中,用|號分開你所有想要匹配的字段了。
知道了這一點,後面的情況就勢如破竹了。
2.二段體
創建一個這樣的表達式雛形:
\.()\.()
由於已經具體到網址的主體部分,所以前後的/或者.也就不需再出現了
例:
\.(boyis|allyes|cjt1|w163|ppzxw|1000downloads)\.(net|com)
它等價於
http://*.allyes.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*
或許有朋友問,為什麼分開三種情況呢?整合到一起去有沒有可能?
一個很自然的想法是用一個"?"號來表示三段體中的第一段或者出現,或者不出現,
例如想要整合admig.163.com和*.boyis.com,這樣寫的話:
(adimg)?\.(163|boyis)\.(com)
因為adimg這個字段可出現也可不出現,所以實際上www.163.com這樣的地址自然也會被匹配上了,這可不是我們的初衷, 這也就是為什麼我覺得應該把各種情況分開考慮,當然更期待高手能解決這個問題。
其次,鑑於"|"符號會導致自由組合,整合度不應太高。三段體例子中,第一個括號中最好不要放進通用性太強的字段,
如www,否則"|"符號產生自由組合,若要過濾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)的文件類型判斷,
鑑於這個時候網站網址變化很大,這個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
=================================================
寫得不錯..不過我根據上面寫的去做
例如
http://tw.i1.yimg.com/tw.yimg.com/i/tw/hp/0325/pic.jpg
這段我應該可以改成
/(\.|\/)(hp)(s)?(\d)*(\.|\/|_)/
不過卻會擋住在hp下的mh750_v10
上面那一排選項改成這樣/(\.|\/)(hp^mh750_v10)(s)?(\d)*(\.|\/|_)/ 還是不行