返回列表 发帖

[TheWorld 2] TheWorld 2 广告过滤规则教程

一、序
        
      本文只对 TheWorld 2 广告过滤功能中的 HTML 页面过滤规则进行说明,传统方式的过滤不在本文范围之内;
      HTML 页面过滤规则的编写过程中需要一定正则表达式和 HTML 语言基础,这些也不在本文范围,这些请参考相关资料;
      文章最后附有正则表达式基本语法以及转义字符的参考;

二、HTML 页面过滤功能介绍

      TheWorld 2 的 HTML 页面过滤规则的具体格式如下:
#(type)#(restring)###(replace string)
type 种类
#ex#     //所有页面通用的页面内容过滤正则表达式
#exh#   //针对HTTP头的过滤正则表达式
#exd#   //指定网址的页面内容过滤正则表达式


三、实例
        
      我们结合实际的例子来详细说明 HTML 页面过滤规则的编写方法,这次的实例是过滤世界之窗论坛首页的联盟论坛部分。
      看图,图中红色部分就是我们要过滤的部分:
       01.jpg

      首先,打开世界之窗论坛首页,用鼠标选择菜单栏的"查看"->"源文件",在打开的文件中查找"联盟论坛",会找到下面一段代码:
  1. <tbody><tr><td colspan="3" class="header"><a href="###" onclick="toggle_collapse('forumlinks');"><img id="forumlinks_img" src="images/default/collapsed_no.gif" border="0" align="right" alt="" /></a>
  2. <span class="bold">联盟论坛</span></td></tr></tbody>
  3. <tbody id="forumlinks" style="">
  4. <tr class="row" onMouseOver="this.style.backgroundColor='#F5FBFF'" onMouseOut="this.style.backgroundColor='#FFFFFF'">
  5. <td width="5%" align="center" valign="middle"><img src="images/default/forumlink.gif" alt="" /></td>
  6. <td width="95%" colspan="2" valign="middle" style="word-break: keep-all"><a href="http://cool.ever360.com" target="_blank"><span class="bold">凤凰城博客</span></a><br>读好书,聊影音,玩数码,论IT--让我们一起快乐,一起收获。</td>
  7. </tr>
  8. <tr class="row" onMouseOver="this.style.backgroundColor='#F5FBFF'" onMouseOut="this.style.backgroundColor='#FFFFFF'">
  9. <td width="5%" align="center" valign="middle"><img src="images/default/forumlink.gif" alt="" /></td>
  10. <td width="77%" valign="middle"><a href="http://bbs.dreammail.org/" target="_blank"><span class="bold">DreamMail-专业的电子邮件客户端</span></a><br>One TheWorld, One DreamMail</td>
  11. <td width="18%" align="center" valign="middle"><img src="http://bbs.dreammail.org/images/logo/dreammail.gif" border="0" alt="" /></td>
  12. </tr>
  13. <tr class="row" onMouseOver="this.style.backgroundColor='#F5FBFF'" onMouseOut="this.style.backgroundColor='#FFFFFF'">
  14. <td width="5%" align="center" valign="middle"><img src="images/default/forumlink.gif" alt="" /></td>
  15. <td width="95%" colspan="2" valign="middle" style="word-break: keep-all"><a href="http://www.cnbeta.com/" target="_blank"><img src="http://www.cnbeta.com/pic/logo_cnbeta.gif" border="0" alt="cnBeta" /></a> <a href="http://bbs.360safe.com/" target="_blank"><img src="http://www.360safe.com/img/BBSlink.gif" border="0" alt="360安全论坛" /></a> <a href="http://bbs.yy-s.com" target="_blank"><img src="http://www.yy-s.com/logo.gif" border="0" alt="异域设计" /></a> <a href="http://bbs.hypost.cn/" target="_blank"><img src="http://bbs.hypost.cn/1/绅博论坛.gif" border="0" alt="绅博论坛" /></a> <a href="http://www.deepin.org/index.php" target="_blank"><img src="http://www.deepin.org/flogo.gif" border="0" alt="深度技术论坛" /></a> <a href="http://bbs.coralqq.com" target="_blank"><img src="http://bbs.coralqq.com/logo.gif" border="0" alt="珊瑚虫论坛" /></a> <a href="http://www.pcpchina.com/" target="_blank"><img src="http://bbs.pcpchina.com/links/logo_pcpchina.gif" border="0" alt="PCPChina 先锋网-[资讯先导 个性先锋]" /></a> <a href="http://bbs.hfqq.cn" target="_blank"><img src="http://fjds.bokee.com/inc/logo.gif" border="0" alt="海峰精品论坛" /></a> <a href="http://www.zhmy.com/softwork/" target="_blank"><img src="http://www.zhmy.com/softwork/Logo.gif" border="0" alt="极智在线" /></a> <a href="http://www.arswp.com/" target="_blank"><img src="http://www.arswp.com/images/logo_07.gif" border="0" alt="Windows清理助手" /></a> <a href="http://www.f2blog.com" target="_blank"><img src="http://forum.f2blog.com/f2s.gif" border="0" alt="自由志" /></a> <a href="http://www.hack86.com/bbs/index.php" target="_blank"><img src="http://www.hack86.com/logo.gif" border="0" alt="中华隐士黑客联" /></a> <a href="http://www.fk68.net" target="_blank"><img src="http://www.fk68.net/logo.gif" border="0" alt="废客联邦" /></a> <br><a href="http://www.zixun007.com/" target="_blank">[资讯之家]</a> <a href="http://www.pet100.cn" target="_blank">[宠爱天下]</a> <a href="http://7n7i.net" target="_blank">[数码领地]</a> <a href="http://www.fosoho.com/" target="_blank">[浮世绘]</a> <a href="http://www.7fnet.com/" target="_blank">[清信资讯]</a> <a href="http://www.sun.hk.cn/" target="_blank">[Andrew's]</a> </td>
  16. </tr>
  17. </tbody>
复制代码


        这些就是"联盟论坛"部分的 HTML 代码,写出匹配这一段代码的正则表达式(具体过程就不详细解释了,正则表达式部分请参考网络上的各种教程)
匹配"联盟论坛"部分的 HTML 代码的正则表达式如下:
  1. <tbody>[\s\S]*?联盟论坛(?:[\s\S]*?<\/tbody>){2}
复制代码

        依照开头的 HTML 页面过滤规则的格式写出过滤规则:
  1. #exd#*ioage.com*#<tbody>[\s\S]*?联盟论坛(?:[\s\S]*?<\/tbody>){2}###<!--Ad blocked by TheWorld2-->
复制代码

        现在把上面的过滤规则加入到 TheWorld 2 的黑名单中,然后彻底刷新(ctrl+F5)世界之窗论坛首页,效果如下图,这个时候看不到"联盟论坛"了,过滤规则有效。
        02.jpg

四、尾声

      通过上面的实例大家应该了解 HTML 页面过滤规则的具体编写过程了,其中需要一定的正则表达式和 HTML 语法知识,但并不是说一定要精通这两样,实际上只需要这两样的一些皮毛知识,稍微研究一下大多数人是很容易学会的,文章最后附有正则表达式的基本语法和转义字符表给大家作参考

五、附录(正则表达式参考)

基本语法

匹配除换行符(\n)之外的任何单个字符. 要匹配包括 '\n' 在内的任何字符, 可以使用 [.\n] 模式.
   
\
转义字符, 用于转义紧跟的字符. 详情请参考转义字符表.

[...]
定义一个字符类, 匹配方括号内的任意一个字符.
字符集中的元字符: "] \ ^ -". 若字符集中需要匹配元字符, 请使用 \元字符.
例: [ab\^c] 可以匹配单个字符 a, b 或 ^.

[^...]
定义一个非匹配字符类的开始处, 它表示否定该字符类, 即匹配不在方括号中出现的任何字符.
例: [^abc] 可以匹配 e, 7, z 等除 a, b 和 c 之外的字符.

^
如果 ^ 出现在正则表达式最前边, 它匹配输入字符串的开头.
例: ^[abc] 匹配输入字符串开头的 a, b 或 c , 如 about us, be it, can you?.

$
放在正则表达式的最后, 匹配输入字符串的末端.
例: [0-9]$ 匹配输入字符串末端的一个数字字符, 如 last 9, add 1.

|
"或"分隔符, 分隔多个表达式, 只须匹配其中一个.
例: th(is|at|ese|ose) 可以匹配 this, that, these 或 those.

-
在字符类中, 指定一个字符范围.
例: [0-9] 匹配 0 到 9 的数字.

?
匹配前面的子表达式零次或一次. ? 等价于 {0,1} .
例: do(es)? 可以匹配 do 或 does.

+
匹配前面的子表达式一次或多次. + 等价于 {1,} .
例: zo+ 能匹配 zo 以及 zoo 或者 zoooo, 但不能匹配 z .  

*
匹配前面的子表达式零次或多次. * 等价于 {0,} .
例: zo* 能匹配 z 以及 zoo .  

{n}
匹配前面的子表达式确定的 n 次. n 是一个非负整数.
例: o{2} 不能匹配 Bob 中的 o , 但是能匹配 food 中的 oo .  

{n,}
匹配前面的子表达式至少 n 次. n 是一个非负整数. e{1,} 等价于 e+ , e{0,} 则等价于 e* .
例: e{2,} 不能匹配 Bed 中的 e , 但是能匹配 feel 和 feeeeel 中所有的 e .

{n,m}
匹配前面的子表达式最少 n 次且最多 m 次. n<=m, m 和 n 均为非负整数. 在逗号和两个数字之间不能有空格.
o{0,1} 等价于 o? .
例: o{1,3} 可以匹配 fooooood 中的前三个 o .

??,  +?,  *?,  {n}?,  {n,}?,  {n,m}?
?, +, *, {n}, {n,}, {n,m} 的非贪婪匹配版本, 非贪婪匹配在匹配时会尽可能匹配较少的字符.
例: 输入字符串为 <abc><def>
使用非贪婪匹配 <.*?> 会匹配 <abc> .
使用贪婪匹配 <.*> 会匹配整个 <abc><def> .  

(pattern)
表达式分组操作符. 用于分隔子表达式和返回部分匹配结果. 返回的结果可以在替换操作的时候用 $1 - $10 表示.
例: (\d+,)*\d+ 可以匹配逗号分隔的数字字符串, 如 41 或 1,23,456 .  

(?:pattern)
非获取匹配分组, 匹配 pattern 但不返回匹配结果, 这样可以节省资源, 也不容易与获取匹配的结果混淆.

(?=pattern)
肯定正查(Positive Lookahead). 作用类似 $, 匹配任何后缀有符合 pattern 字符串的之前的位置,
这是一个非获取匹配.
例: Windows (?=95|98|NT|2000) 匹配 Windows 2000 中的 Windows, 而不匹配 Windows 3.1 中的 Windows.
最终返回的是 Windows 而不包含 pattern 匹配的 2000 部分.

(?<=pattern)
肯定反查(Positive Lookbehind). 作用类似 ^, 匹配任何前缀有符合 pattern 的字符串之后的位置,
这是一个非获取匹配.
例: (?<=Windows|MacOS|Linux|Unix) Now 匹配 Windows Now 中的 Now, 而不匹配 PalmOS Now 中的 Now.
最终返回的是 Now 而不包含 pattern 匹配的 Windows 部分.

(?!pattern)
否定正查(Negative Lookahead). 作用类似否定的 $, 匹配任何后缀不符合 pattern 字符串的之前的位置,
这是一个非获取匹配.
例: Windows(?!95|98|NT|2000) 匹配 Windows 3.1 中的 Windows, 但不匹配 Windows 2000 中的 Windows.
最终返回的是 Windows 而不包含 pattern 匹配的 3.1 部分.

(?<!pattern)
否定反查(Negative Lookbehind). 作用类似否定的 ^, 匹配任何前缀不符合 pattern 的字符串之后的位置,
这是一个非获取匹配.
例: (?<!Windows|MacOS|Linux|Unix) Now 匹配 PalmOS Now 中的 Now, 而不匹配 Windows Now 中的 Now.
最终返回的是 Now 而不包含 pattern 匹配的 PalmOS 部分.

(?#comment)
注释, 不作处理.

$i
表示前面用 () 捕获的第 i 个子表达式. i = 1, 2, 3...
例: $1 表示前面用 <a[^>]*?href=(".*?")[^>]*?> 捕获 <a href="http://bbs.ioage.com/">
得到的 "http://bbs.ioage.com/" 部分. 用于 replace 及 return 部分


转义字符表
\w
表示任意字母和数字, 等价于 [a-zA-Z0-9]

\W
表示任意非字母和数字字符, 等价于[^a-zA-Z0-9]

\s
表示任何空白字符, 包括空格, 制表符, 换页符等等, 等价于 [ \f\n\r\t\v]

\S
表示任何非空白字符, 等价于 [^ \f\n\r\t\v]

\d
表示任意数字, 等价于 [0-9]

\D
表示任意非数字字符, 等价于 [^0-9]

\b
表示单词边界, 即字母和空格之间的位置. 也可能表示退格键.  

\B
表示非单词边界

\i
表示前面用 () 包含的第 i 个子表达式. i = 1, 2, 3...
例: <t(.*?)>caption<\/\1> 可以匹配 <title>caption</title>, 注意里面的 \1 .  

\t
表示制表符

\n
表示换行符

\r
表示回车符

\x##
表示十六进制值为 ## 的字符, ## 必须为两个字符. 正则表达式中使用 ASCII 编码.
例: \x41 等价于 A , \x041 则等价于 \x04 后面带一个字符 1 .  

\u####
表示十六进制值为 #### 的 Unicode 字符.
例: \u2103 等价于摄氏度符号 ℃ .


[ 本帖最后由 elkay 于 2007-7-17 02:14 编辑 ]

返回列表