https://adblockplus.org/zh_CN/filters
撰写Adblock Plus 过滤规则
当前的Adblock Plus版本允许你通过许多不同的方法来优化你的过滤规则。本文档描述了你可以使用的方法,并告诉你如果去使用它。
声明 :这里给出的所有的过滤规则只是例子而已,并不能直接使用。
AdBlock Plus 过滤规则介绍
基本过滤规则
通常你定义得最琐碎的过滤规则当然是阻挡banner 地址的。但是这些地址在你每次打开页面的时候都会 改变。例如:可能是http://example.com/ads/banner123.gif 。其中的123就是个随机的数字。所以 阻挡完整的图片网址没有效果,通常你需要更通用的过滤规则,例如http://example.com/ads/banner*.gif 甚至 http://example.com/ads/*
注意 :不要过多地使用通配符。过滤规则:http://example.com/* 虽然可以阻挡所有的banner , 但也会阻挡example.com 下其他一些你想看的内容。
定义例外规 则
有时你可能会发现某个过滤规则平时挡广告挡得很好,但在某些情况下,会阻挡不该挡的内容。 你不想移除这条过滤规则,但也不希望它阻挡不该挡的内容。
这就是例外规则的好处——它们允许 你定义过滤规则不被使用的情况。例如:当你对adv 规则阻挡了 http://example.com/advice.html 不 爽的时候,这时你就可以定义一条例外规则@@advice 。例外规则的写法与过滤规则完全一样,你可以使用通配符和正则表达式。你只需 要通过@@ 表明一个例外的规则。
例外规则可以处理得更多。如果一条例外规 则以http:// 或https:// (在前面加上管线符号(|))开始,这会使所有的页面都是例外。例如:如果你 的规则是@@|http://example.com ,你浏览http: //example.com 的页面 时,Adblock Plus对这个页面将会失效,这将不会阻挡任何东西。
匹配网址 开头/结尾
通常Adblock Plus处理过滤规则时,会自己假设在过滤规则的开头与结尾都有一个通配符,也就是说,ad 与*ad* 效果是一样 的。通常这并不会带来问题,但有时你可能想要设定可以匹配以网址开头或结尾的过滤规则。例如:你想要阻挡所有的Flash,如果你加入一条规则swf,阻 挡的将不只是以swf结尾的地址, http://www.example.com/swf/index.html 同样也会被阻挡。
要解决这个问题的办法就是:使用管线符号(|)来代表网址的最前端或最末端。例如:过滤规则swf| 会 阻挡 http://example.com/annoyingflash.swf 但不会阻挡http://example.com/swf/index.html 。 过滤规则|http://baddomain.example/ 会阻挡http://baddomain.example/banner.gif 而 不会阻挡http://gooddomain.example/analyze?http://baddomain.example 。
有时你想阻止http://example.com/banner.gif 和https://example.com/banner.gif 以 及 http://www.example.com/banner.gif 。这时只需把两个管线符号(|| )放到 过滤规则的域名前面。||example.com/banner.gif 会阻挡上面的地址,而不会阻挡http://badexample.com/banner.gif 或 者http://gooddomain.example/analyze?http://example.com/banner.gif (需 要 Adblock Plus 1.1 或更高版本).
标记分隔符
通常你需要接受过滤规则的任何分隔符。例如,你可能写这样的一个规则:阻挡http://example.com/ 和 http://example.com:8000/ 但是不阻挡http://example.com.ar/ 。 这里的符号()用作一个分隔符。{{{http://example.com }}} (需要的AdBlock加1.1或更高).
分隔符可以是除了– . %之外的任何字符或数字。这个地址的结尾也是作为一个分隔符下面的例子中所有的分隔符以红色标记出:http://example.com:8000/foo.bar?a=12&b=%D1%82%D0%B5%D1%81%D1%82 。 所以这个地址可以通过过滤规则^example.com^ 或者^%D1%82%D0%B5%D1%81%D1%82^ 或者^foo.bar^ 过滤
注释
任何以感叹号(!)开始的规则,都被视为注释。在过滤规则的列表中,仍然会显示这些规则,但会用灰色的字来显示,而不是黑色。 Adblock Plus在判断规则时,会忽略这些注释,所以我们可以写下任何我们想写的东西。你可以在一条规则上面写下这条规则是做什么用的。也可以在过滤列表的上方写 上作者信息(大多数过滤列表的作者已经这样做了)。
进阶功能
本章节描述的特性通常只有高级用户和维护过滤列表的作者才会看。一般使用者可以跳过。
指定过滤规则选项
Adblock Plus可以让你指定某些选项来改变某条规则的行为。你列举这些选项的时候将它们放在美元符号($)后面并用逗号(,)分割这些选项,放在过滤规则的最后 面。例如:
这里的*/ads/* 是真实的过滤规则,script 与match-case 是 它指定的选项。以下是目前支持的选项:
- 类型选项:判定过滤规则(或例外规则) 过滤元素的类型。过滤规则可以明确指定多种元素类型可以指定的类型包括:
- script —— 外部脚本,由HTML script标签加载
- image —— 一般图片,通常由 HTML 的 img 标签所载入
- background ——背景图片,通常用CSS指定
- stylesheet —— 外部CSS 样式表
- object —— 由浏览器插件处理的内容,例如Flash或Java
- xbl —— xbl绑定(通常由 -moz-binding CSS属性加载) 需要Firefox 3或更高版本
- ping pings 需要Firefox 3或更高版本
- XMLHttpRequest XMLHttpRequest 对 象 开始的请求 需要Firefox 3或更高版本
- object-subrequest —— 插件的请求,比如Flash 需要Firefox 3或更高版本
- dtd —— 通过XML文档加载的DTD文件 需要Firefox3或更高版本
- subdocument —— 内嵌的页面,通常通过HTML的框架方式内嵌
- document —— 网页本身(只有 例外规则 适用)
- other —— 其他不在上面的类型的请求,(在Firefox 2 中,这个包括XBL bindings, XMLHttpRequests )
- 反 转类型选项:指定过滤规则 不应用的元素类型。可以指定的类型选项: ~script, ~image, ~background, ~stylesheet, ~object, ~xbl, ~ping, ~xmlhttprequest, ~object-subrequest, ~dtd, ~subdocument, ~document, ~other
- third-party/first- party请求限制:如果指定third-party选项,则过滤规则只适用于来源与当前正在浏览的页面的不同的请求。类似地,~third-party 适用于来源与当前浏览页面相同的请求。
- 域名限制:domain= example.com 指过滤规则只适用于 了”example.com”下的页面。多个域名,可以用”|”分隔:过滤规则 domain=example.com|example.net 将 只适用于”example.com”或”example.net”的页面。如果一个域名是前面有”~”,则该规则不适用于这个域名的页面。例如,domain=~example.com 指 过滤规则适用于除了example.com 之外的任何域名的页面,但domain=example.com|~foo.example.com 限 制了过滤规则适用于”example.com”但是不包括”foo.example.com”。
- match-case —— 使过滤规则只适用于匹配地址,例如规则*/BannerAd.gif$match-case 将阻止http://example.com /BannerAd.gif 但是不阻止http://example.com/bannerad.gif 。
- collapse —— 这个选项将覆盖全局“折叠屏蔽元素”,并确过滤规则总是折叠元素。类似地,~collapse选项将确保过滤规则不折叠元素
使用正则表达式
如果你想更好地控制您的过滤规则,什么匹 配,什么不匹配,你可以使用正则表达式。例如过滤规则{{{/banner/d+/}}会匹配matchbanner123 和banner321 但 是不匹配banners 。您可以查看 正则表达式的文档 来学习如何写正则表达式。
注 :你 不应该 为了加快处理您的过滤列表而使用正则表达 式。你可能听过类似的说法,但其实那已经过时了。从 Adblock Plus 0.7 开始,基本过滤规则的处理已经比正规表达式快了。
元素隐藏
基本规则
有时你可能会发现无法阻挡某些内嵌在网页中的文字广告。如果查看源码的话,可能发现类似这样的代码:
<div class = "textad" > Cheapest tofu, only here and now! <div> <div id = "sponsorad" > Really cheap tofu, click here! <div> <textad> Only here you get the best tofu! </textad>
因为你必须下载页面的内容,所以你也必须下载这些广告。对于这种情况,你可以做的就是-把这些广告藏起来,这样你就不会看到他 们了。这也就是元素隐藏的意义所在。
上面代码中的第一则广告是在一个class属性为 “textad”的div 容器内。过滤规则#div(textad) 可以把它给隐藏起来。这里的##表明这是一条定 义了元素隐藏的选择符的元素隐藏规则类似地,您可以通过他们的id属性隐藏属性, #div#sponsorad 将隐藏的第二广告。你 也可以不必指定元素名称,用#*(sponsorad) 也可以。你也可以仅指定要阻挡的元素名称来隐藏,例如:##textad 可 以阻挡第三则广告。
在不查看页面源码的情况下,Element Hiding Helper extension 帮助选择正确的元素并写出相应的规则基础的HTML知识还是很有用的。
注 : 元素隐藏规则与普通过滤规则的工作方式有很大的差别。元素隐藏规则不支持通配符。
隐藏元素:限定在特定域名的规则
通常你只想要隐藏特定网站的特定广告,而不希望规则会作用于其他网站。例如:#*(sponsor) 可 能会把某些网站的有效代码也隐藏了。但如果你把隐藏规则写成example.com##*(sponsor) ,这规则就只会作用在 http://example.com/ 与http://something.example.com/ ,但不作用在http://example.org/ 。 你也可以指定多个域名-只要用逗号(,)分隔即可,例如: domain1.example,domain2.example,domain3.example##*(sponsor)
如果在域名之前有“ ~ ” ,该规则将不 适 用于这个域名的页面。(需要的AdBlock加1.1或更高) 。例如, ~example.com##*.sponsor 将适用于出 了“example.com”之外的域名。 example.com|~foo.example.com##*.sponsor 适用于 “example.com”域名以及除了 “foo.example.com“外的字域名。
注 :由于元素隐藏实际实现的关系,你只可以将隐藏规则限制在完整的域名。你不能使用网址的 其他部份,也不可用 domain 代替domain.example,domain.test
注 :限制域名的元素隐藏规则也可用来隐藏浏览器的使用界面。例如, 过滤规则browser##menuitem#javascriptConsole 会隐藏Firefox的工具菜单上的JavaScript控制台。
属性选择符
一些广告隐藏起来并不容易——这些文字广告不仅没有id也没有class属性。你需要使用其他属性来隐藏这些广告,例如:##table[width=80%] 可 以隐藏拥有width属性值为80%的表格元素。如果你不想隐藏这个属性的所有值,##div[title*="adv"] 会隐藏所有title 属 性包含adv 字符的div 元素。你还可以检查属性的开始和结束字符。例如##div[title^="adv"][title$="ert"] 会 隐藏以adv开始并且以ert结束的div元素。正如你所见,你可以使用多个条件,table[width="80%"][bgcolor="white"] 会 隐藏宽度设为80% 、背景色(bgcolor)属性为白色的表格元素。
高 级选择符
一般情况下,Firefox支持的 CSS选择符都可用于元素隐藏。例如:下面的规则会隐藏跟在class 的属性为adheader 的div 元 素后的所有东西:##div.adheader + * 。完整的CSS列表请查阅W3C的CSS规范(Firefox目前并没有支持所 有的选择符)。
注 :这个功能是给高级使用者使用的,你可以通过CSS选择符很舒 服地去使用它。Adblock Plus 无法检查选择符的语法是否正确,如果你使用无效的 CSS 语法,你可能会破坏其他你已有的过滤规则。建议使用 JavaScript Console 检查是否有 CSS 错误。
简单元素隐藏语 法
Adblock Plus 只向后支持简单元素隐藏语法 (例如#div(id=foo) )。 使用这个语法是不好的,用CSS选择符才是首选。对这个语法的支持可能在以后的某个时间就不支持了。