Skip to content

基于正则表达式的过滤规则

fang5566 edited this page Jun 18, 2015 · 5 revisions

Adblock Plus 过滤规则语法支持使用正则表达式作为过滤规则

我个人不太建议使用正则表达式的过滤规则,这也是我一直以来不在 uBlock 中添加支持的原因 ― 防止用户养成一种使用正则表达式写规则来屏蔽网络请求的坏习惯。

但这么做的后果是经常出现各种流言,说 uBlock 节省内存和 CPU 的因为它不支持正则表达式过滤规则。这完全是一派胡言,要说 EasyList 到目前为止的上万条规则里面总共也只有 15 条这样的规则。

就因为这流言,我最终决定从 0.8.6.0 开始支持正则表达式过滤规则:

在用的正在表达式规则

uBlock 有一套内部运行机制,因此相比其他流行的过滤工具,它实现起来更加高效。

一条高效的正则表达式规则应该是不需要求值(evaluate)的。

如果你决定自己写一条正则表达式过滤规则,下面是让你的正则表达式尽可能高效的一个技巧:

使用过滤规则选项来减少正则表达式规则执行的可能性。

一条效率最高的正则表达式规则应该包含以下一些规则选项:

  1. 类型:只有在规则匹配特定请求类型的情况下该规则才会生效。
    • 例如:/\.filenuke\.com/.*\/[a-zA-Z0-9]{4}/$script 仅当请求的类型为 script 时才被执行(这条规则可在 EasyList 里找到)
  2. domain=:请求的主机名必须与 domain 规则选项中的主机名匹配,正则表达式才会被执行
  3. third-party:请求必须为与 third-party 选项(或反过来的 ~third-party)一致,正则表达式才会被执行

下面这条来自 EasyList 的正则表达式规则 uBlock 处理起来非常高效:

/http:.*(?:\+|\@|\=|\;|\_|\-|\!|\?|\&|\%|\#|\^|\:).*\/\//$script,third-party,domain=allenbwest.com

这条规则包含上述所有选项,因此正则表达式基本不会被执行。仅当请求类型为 script,所在域名为 allenbwest.com 并且为第三方请求时正则表达式才被执行。

听起来像是一个基本常识,实际上本来就这样。但我所知道的其他过滤工具对每条请求都不加区分地执行所有正则表达式规则。(更新: 对此 ABP 已做了修复

Clone this wiki locally