网页过滤规则编辑器
Previous Back to contents Next

这就是网页过滤规则编辑器。在这里你可以使用匹配规则来让 Proxomitron 重写网页。点击下图的不同部分可以获得对该部分的解释。

基础...

简单的说,过滤规则的工作方式类似于文字处理的 "搜索和替换" 功能。任何被 "匹配表达式" 所匹配的文本都会被 "替换文本" 里的文本所替换。例如,如果一条规则的匹配表达式是 "Rimmer" ,替换文本是 "That Smeghead" ,这条规则会把网页上所有出现的 "Rimmer" 都换成 "That Smeghead"。简单吧?

当你往规则里加入匹配规则的时候就会变得有趣了。

"<start>" 和 "<end>"

除了普通的文本和匹配表达式,匹配语句可以是两个有特殊含义的值: <start><end>.

<start>可以在网页的最顶部插入替换文本 - 使用它来添加像是 Javascript 之类的东西。而 <end> 可以用来附加东西到网页最底部。

对于这两种特殊情况,范围和限制都会被无视。另外当在多个规则里使用时,项目会按网页过滤规则列表里规则的先后次序加入。

范围到底是什么?

在 HTML 里一段标签有数行是很平常的事情,而范围设定允许规则确定在找到匹配的开始后应该继续找多远以找到匹配的结束。没有范围的话,规则可能要把整个网页都扫描一遍才能确定没有可以匹配的项目,这不是一个好主意。因为这样的话,在整个网页被 Proxomitron 处理完毕前,浏览器无法接收到任何数据。感谢 HTML 的设计者让标签有开始和结束值,让事情轻松了很多。

字节限制和边界限制都可以用来限制搜索的文本量。

字节限制(Byte Limit) 控制在规则放弃匹配前应该搜索多少个字符。通常这个值越小越好 - 对于大多数标签,128 - 256 或更少的数字就可以了。如果有些规则需要过滤更多字节可以增加该数字。但是如果数字过大的话,会让页面显示过于缓慢,因为程序需要处理完字节限制量的字符才能发送给浏览器。

通常最佳的数字很大程度上取决于标签。例如 "<Script ... </script>" 标签,由于可能包含很多行 Javascript,通常需要一个较大的限制。这种情况下试试大约 4096 左右的字节限制。

边界限制(Bounds Limit) 是用来控制主匹配表达式匹配范围的预匹配。通常边界检测由 HTML 的开始和结束标签中间加一个星号组成 - 例如 "<script * </script>"。任何在匹配表达式里可以使用的在这里也可以使用,但是边界限制越简单越好。

边界限制是可选的 - 对于大多数的简单匹配表达式来说你并不需要它。但是,对于一些复杂的主匹配表达式,边界限制可以增强性能。这是因为边界限制返回 true 时才会检测主匹配表达式。更重要的是,它也可以用来防止一个规则匹配它不该匹配的文本。以下面这个用来匹配网页链接的规则为例....

Matching: <a * href="slugcakes.html" > * </a>

如果下面是被匹配的文本...

<a href="crabcakes.html" > some stuff </a><br>
<a
href="slugcakes.html" > other stuff </a>

第一个星号会匹配整个高亮的蓝色区域的两个链接而不仅仅是第二个!使用边界检测像是 "<a * </a>" 的话,这个规则就会每次只检查一个链接。

匹配表达式和范围检测

如果没有使用范围检测的话,永远不要在匹配表达式的开始或结束使用通配符(例如 " *foo* ")。这会导致规则匹配字节限制数目的字符 - 通常不是你所希望的结果。

如果使用了范围检测的话,情况就不一样了。因为它会选择特定的需要搜索的文本范围 - 整个规则下,匹配表达式只能匹配 被范围检测预匹配的文本。最简单的使用范围检测的方法就是在开始和结束表达式中间加一个通配符。通常可以使用匹配变量(像是 "\1 foo \2"),这样你可以把需要匹配的文本以外的字符捕获进变量,并在替换文本里使用。

这是一个匹配类似 <a href="http://somewhere"> some text </a> 链接的例子

Bounds: <a\s*</a> Limit: 128
Matching: * href="\1" *
Replace: <a href="\1"> some new link next </a>

URL 匹配 - 另一种边界控制

你可以使用 URL 匹配来限制规则只在特定的网页发挥作用。所有匹配规则在这里都适用,这样你只需要匹配 URL 的一部分。多个页面可以用 OR 符号"|" 连接,像是 "www.this.com|www.this.too.com",并且页面可以用 "(^...)" 来排除,像是 "(^www.not.this.page)".

另外注意 URL 的 "http://" 部分会在匹配开始前被移除 - 不要检测这部分。

如果你有一堆需要匹配的 URL 或是想要在多个过滤规则里使用相同的 URL,你可以在这里使用一个 过滤文件。例如,如果你有一个叫作 "MyURLs" 的过滤文件,你希望这个规则只在过滤文件里的站点里发挥作用,只要在 URL 匹配里输入 $LST(MyURLs) 就行了。同样的,如果你希望规则只在过滤文件里没有的站点发挥作用,只要像 (^$LST(MyURLs)) 这样用一个 NOT 表达式就行了。事实上,如果你右键点击 URL 匹配,你可以在右键菜单里看到一个自动添加或修改过滤文件的命令。

你还可以在右键菜单里看到一个测试 URL 匹配的选项。这和规则测试是类似的,并且会允许你方便地看到给定的 URL 是否匹配。

"Allow for multiple matches" 是做什么的?

通常,规则匹配后的结果会被立刻发送到浏览器里 - 其他任何规则都都不允许处理匹配部分。这主要是为了提高效率,因为这样可以省下非常多的时间,但在给特定的规则高优先级时也很有用 - 先检测的先匹配。

但这并不总是我们希望的。以 "<Body ... >" 标签为例 - 它可能包含数个我们希望改变的毫无关联的元素。例如,如果我们有两个规则 - 一个改变默认的字体颜色,另一个改变背景图片 - 我们就会遇到一个问题。第一个规则会 "消耗" 掉 <Body> 标签,从而阻止第二个规则正常工作。这就是需要用到 "allow for multiple matches" 的地方。勾选此项后,Proxomitron 会把该规则的匹配结果插入进处理缓冲中,这样其他规则也可以继续处理被匹配过的文本。在上面的例子中,如果我们开启第一个规则的多重匹配,第二个规则就也会正常匹配了。

小心使用这个功能 - 虽然它很强大,却需要比普通情况更多的处理,如果不小心的话还有可能造成"递归"匹配。

考虑以下情况 - 我们有一个规则,匹配语句是 "frog",替换文本是 "The evil frog must die!"。是不是看上去挺傻的?不过如果这个规则开启了多重匹配,那么替换文本里的 "frog" 也会导致该规则匹配它本身的输出 - "frog" 成灾!为什么?原因是规则第一次看到单词 "frog" 后,它会插入句子 "The evil frog must die!" - 这理解起来应该很简单,但是规则会继续扫描它的匹配结果,并又找到一个新的 "frog"... 整个过程不断重复。解决方法?如果 "frog" 在匹配里是替换文本里的第一个单词的话就不会发生这种事了。下一次匹配永远会往后面移一个字符。所以第二次扫描时规则看到的是 "rog" 而不是 "frog"。只要保证你的规则不会匹配它自己的替换文本 - 至少不是第一个字符 - 就行了。


返回目录