关于将正则表达式的过滤语句转化为Proxomitron规则

新手入门、经验交流

Moderator: cre

Forum rules
  • 软件自带帮助是最好的入门教程,请仔细阅读;在您掌握最基本知识前,我们没法帮助您
  • 提问前请先查阅软件帮助文件和论坛相关讨论
  • 查阅软件帮助和论坛相关讨论即可解决的问题帖将直接删除,以免浪费他人时间
  • 请学会如何提问,尽量将问题描述清楚,不明确的提问将被直接删除
Post Reply
sixsheeps
Posts: 30
Joined: Jan 17 2008, 14:59

关于将正则表达式的过滤语句转化为Proxomitron规则

Post by sixsheeps »

一直在用“世界之窗”【后简称tw】浏览器,其自带的过滤广告功能可以使用正则表达式,功能比较强大。但没有p强大。
发现它的新浪网的过滤语句很有效。遂想转移过来。发现自己对于p的了解还是不深。希望得到指点。

问题1:

这是tw的新浪网过滤语句
#exd#*.sina.*#<!--_SINA_ADS_BEGIN_-->[\s\S]*?<!--_SINA_ADS_END_-->###<!--Ad blocked by TheWorld2-->
#exd#*.sina.*#<!--\s(顶通区域|顶通ad|购物图文)\sbegin -->[\s\S]*?<!--\s\1\send -->###<!--Ad blocked by TheWorld2-->
#exd#*.sina.*#<a[^>]*?adfclick[^>]*?>[\s\S]*?<\/a>###<!--Ad blocked by TheWorld2-->
#exd#*.sina.*#<!--企业服务文字广告开始-->[\s\S]*?<!--正文结束-->###</table><!--Ad blocked by TheWorld2-->
#exd#*.sina.*#(<td width=")(640)(" valign="top" class="lc_blue">)###$1100%$3

我改了几个。如:

URL match:*.sina.com.cn
matching expression:<!--_SINA_ADS_BEGIN_--> * <!--_SINA_ADS_END_-->
replacement text:

URL match:*.sina.com.cn
matching expression:广告样式 begin * 广告样式 end
replacement text:

URL match:*.sina.com.cn
matching expression:<!-- 新闻中心首页顶部广告位 begin --> * <!-- 新闻中心首页顶部广告位 end -->
replacement text:
等等一些比较简单的。

#exd#*.sina.*#<!--\s(顶通区域|顶通ad|购物图文)\sbegin -->[\s\S]*?<!--\s\1\send -->###<!--Ad blocked by TheWorld2-->
对于这个语句,比如结构是:

1顶通区域
2顶通ad
3顶通ad
4顶通区域

想14一组。但是如果写成<!-- (顶通区域|顶通ad|购物图文) begin --> * <!-- (顶通区域|顶通ad|购物图文) end -->

结果可能12配为一组。如何使得后面的调用前面捕捉到的文字呢?希望高手解决。

=========================================
问题2:
tw里面有一组黑名单,为正则表达式。

/(?:\.|\/|_|")(?:ads?(?:\d|code|gif|graph|list|log|puba|s?file|sence|site|show)?|(?:ali)?union(?:sky|sys)?|all(?:4ad|yes)|banner|bdun|cp(?:c|ro)|(?:guan|my|newhua)?gg(?:ao)?|keyrun|p(?:4|f)p|sp(?:onsor|code))s?(?:\d)*(?:\.|\/|_)/
/[\W_]ads?(?!=&)(?:banner|click|flow|frame|ima?ge?|log|serv(?:er|e)?|stream|type|view|vert(?:ising|ise?ment)?|trix|xchange|wrapper)?s?[\W\d_]/
/(?:\.|\/|_)(?:soft|hot)?ads?(?:s..|img|vert|rotator|view|bot|c_|client|council|gif|graph|images|info|log|pic)?(?:\.|\/|_)/
/(?:\.|\/|_|")(?:a2d|cooperate|corporate|SogouUnion.*|themis|ulink(?:js|dir)|un|usmsweb|xc)s?(?:\d)*(?:\.|\/|_)/
/(?:\/|\-|_)(?:\d){2,3}x(?:\d){2,3}[^0-9]+(?:swf|gif|jpg|js)/

在p里面应该如何写呢?

------
附tw正则表达语法
基本语法
引用:
匹配除换行符(\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 等价于摄氏度符号 ℃ .
User avatar
phoenix
Site Admin
Posts: 529
Joined: Dec 29 2007, 16:27

Re: 关于将正则表达式的过滤语句转化为Proxomitron规则

Post by phoenix »

sixsheeps wrote:如何使得后面的调用前面捕捉到的文字呢?希望高手解决。
以正则表达式 <!--\s(顶通区域|顶通ad|购物图文)\sbegin -->[\s\S]*?<!--\s\1\send --> 为例:
蓝色部分被()扩起来形成一个group,表示匹配的值将被放入\1变量;后面红色的\1部分即引用前面的值,从而实现标记配对。

而在Proxomitron中,捕捉变量的表达式是(expression)\1,所以上面的表达式应改写为:<!--\s(顶通区域|顶通ad|购物图文)\1\sbegin -->*<!--\s\1\send -->

另外,关于sina过滤的例子,在Proxomitron中我们可以用blockfile的方式,将多条规则合并,比如,只需要下面一条规则即可:

Code: Select all

[Patterns]
Name = "Sina Clean"
Active = TRUE
URL = "$TYPE(htm)[^/]++.sina.com.cn/"
Limit = 30000
Match = "<$LST(Sina)"
Replace = "\0"
然后,建立一个名为Sina的blockfile,内容如下:

Code: Select all

#
# Sina Clean
#
!--_SINA_ADS_BEGIN_--> * <!--_SINA_ADS_END_-->
!-- 新闻中心首页顶部广告位 begin --> * <!-- 新闻中心首页顶部广告位 end -->
td width="640" valign="top" class="lc_blue">		$SET(0=<td width="940" valign="top" class="lc_blue">)
td width="300"*DisplayAd()*</td>
如上面第3条,我们可以将替换后的内容放入\0变量,然后在规则中引用;而其他没有设置\0变量的条目,则表示将被替换为空。
sixsheeps wrote:问题2:tw里面有一组黑名单,为正则表达式。在p里面应该如何写呢?
你给的例子的那种方式将所有关键字写在一起,不利于理解表达式,而且日后的维护很不方便。
在Proxomitron里,如我上面提到的,可以用而且我推荐用blockfile的方式来实现,blockfile是按行添加关键字的,还可以加注释,有利于日后的维护。

具体的转换,就等你搞懂正则表达式和Proxomitron的语法后自己动手吧,那些表达式主要是Alternation操作,很容易转换的。
Post Reply