Skip to content

广告屏蔽规则综述

Crystal-RainSlide edited this page Aug 16, 2020 · 6 revisions

官方文档

uBlock Wiki uBlock Wiki 简体中文翻译
uBO1: Static filter syntax 静态过滤规则语法
uBO2: Procedural cosmetic filters 过程式修饰规则
uBO3: Resources Library 资源库

别的广告屏蔽器呢?

如果有其他广告屏蔽器的文档没有收录,欢迎反馈。但是,如果你正在使用的广告过滤器没有关于广告屏蔽规则的文档,你可能最好先考虑换一个广告屏蔽器。

文档意味着对广告屏蔽器的行为和规则支持等等关键细节的描述。大部分情况下,规则撰写者只是参考这些描述来编写规则,而不是通过浏览广告屏蔽器的源代码等等途径来获取必要的信息。所以,对于规则编写者而言,哪怕是 WebKit Content Blocker,都比 AdBlock 更加理想。一定程度上,这不是有和没有的区别,而是是有救和没救的区别。


注释

引用:

以英文感叹号 ! 字符开头的行都会被作为注释。

示例:

! 什么时候才有(受广泛支持的)多行注释呢
!     感叹号之后,倒是好随便缩进
!!!!! 还可以用感叹号缩进

备注:

  • 暂无行内注释/内联注释;
  • 一些广告屏蔽器支持在注释起始符(或者在任意规则之前)添加空白字符,但这一行为尚未被包括在任何官方文档之内。所以,哪怕是需要缩进,也暂不建议这么做。

网络请求过滤规则

引用:

按从前到后的顺序,一条网络请求过滤规则由一个可选的排除标记、一条必要的链接匹配规则和可选的规则选项组成。

三个部分之间不存在特定的分隔符,但是,排除标记是一个固定符号,规则选项亦拥有必要的起始符,可以起到分辨和分隔各个部分的作用。

形式化语法:

[排除标记]链接匹配规则[规则选项]

或者

[@@]链接匹配规则[$规则选项]

示例

||mp.weixin.qq.com/mp/*report?$image,xmlhttprequest
@@|https://example.com/js/non-script-can-be-allowed-under-https/*$~script

链接匹配规则

链接匹配规则分为普通匹配规则正则表达式匹配规则两种。

普通匹配规则
由**链接匹配符**与任何可不经 URL 转码、直接出现在链接之中的字符组成。 现实使用中,这种链接匹配规则通常是从匹配目标的链接地址修改而来的。 - **如果开头和结尾都是 `/` 字符,就会被作为正则表达式匹配规则处理**; - 如果未以通配符、起止符或域名起始符开头,解析时就会往开头加上一个通配符; - 如果未以通配符或者起止符结尾,解析时就会往结尾加上一个通配符。
正则表达式匹配规则
由一条正则表达式与表达式前后的 `/` 起止符构成。 实际上应当与 JavaScript 的[正则表达式](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions)字面量无异。 但是由于每次网络请求时都将执行一遍所有正则表达式规则,编写时也必须考虑到性能。

备注:

  • 如果普通匹配规则首尾正好都是 / 字符,可以在其前后手动加上通配符 *,就不会被当成正则表达式匹配规则了。
  • 由于每次网络请求时都将执行一遍所有正则表达式规则,编写时必须考虑到性能。

链接匹配符

符号 名称 说明
* 通配符 匹配任意字符
^ 隔断符 匹配链接结尾处(类似正则表达式中的 $)和除了数字、字母、_-.% 以外的任意字符
| 起止符 匹配链接开始处(类似正则表达式中的 ^)或链接结尾处(类似正则表达式中的 ^
只能位于链接匹配规则的开始处或结尾处。
|| 域名起始符 匹配任意 HTTP 协议前缀与当前域名的任何后级域名。
只能位于链接匹配规则的开始处。可将其作为起止符的变种。

排除标记

网络请求过滤规则的排除标记为 @@,位于链接匹配规则之前。

规则选项

引用: ABP1 #options ABP1 #filter-options ABP2 #options uBO1

大坑啊。

目前,规则选项可分为类型过滤选项排除选项。不同广告屏蔽器对规则选项的支持有明显差异,这里也按照不同广告屏蔽器分别进行介绍,其中最先介绍的AdBlock Plus 支持的规则选项受到各种广告屏蔽器的广泛支持。

AdBlock Plus 支持的规则选项

类型过滤选项

类型过滤选项是用于双向过滤不同类型的资源的规则选项。默认为禁止制,即只过滤指定的资源类型。可通过在选项前添加过滤逆转符~),将过滤机制从禁止制改为许可制,即只允许指定的资源类型。

script image stylesheet object xmlhttprequest subdocument ping websocket webrtc font media popup other

过滤逆转符

过滤逆转符 ~ 用于反转类型过滤选项的过滤机制。

排除选项

排除选项是一组专用于排除规则的规则选项。排除选项可将排除规则的作用改为针对页面排除页面中产生的网络请求、排除网页元素修饰规则等等。

document elemhide generichide genericblock

match-case

domain third-party

sitekey csp rewrite

uBlock Origin 支持的规则选项

1p 3p all badfilter css cname ehide empty first-party frame ghide important inline-script inline-font mp4 popunder redirect

redirect-rule specifichide shide xhr

元素修饰规则

元素修饰规则,普遍用于隐藏页面中的元素,一些广告屏蔽器同时有利用元素修饰规则的语法,来容纳一些如脚本规则等的特殊规则。按从前到后的顺序,一条元素修饰规则由通常可选的目标域名、必要的类型标识符和必要的选择器组成。类型标识符同时作为域名和选择器之间的分隔符。

形式化语法:

[目标域名] + 类型标识符 + 选择器

示例:

example.com##body > div > p > a[href="https://www.iana.org/domains/example"]
example.com,~about.example.com#@#div > p > a

备注:

  • 目前,广告屏蔽器一般通过向网页附加优先级极高的特殊[层叠样式表][CSS zh-CN]([CSS][CSS en-US]),来达到隐藏元素的目的;默认情况下,并不会移除元素,以保证页面不受影响。

[CSS zh-CN]https://developer.mozilla.org/zh-CN/docs/Web/CSS [CSS en-US]https://developer.mozilla.org/en-US/docs/Web/CSS

类型标识符

类型标识符标定元素修饰规则的类型。除了屏蔽标识符 ## 与排除标识符 #@#,其他标识符一般被不同的广告屏蔽器用于表示各自专有的特殊规则。

ABP1 #elementhiding 中,其被直接称之为分隔符。

## #@# #?# #$#

目标域名

...

选择器

...

特殊规则