xml 过滤及嵌套匹配问题

新手入门、经验交流

Moderator: cre

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

xml 过滤及嵌套匹配问题

Post by cre »

注册也好久了,看着老说不回答低级问题,我都不敢提问了。这几个问题困扰我好久,怎么弄也弄不好,厚颜来问,莫打击。就是要打击也请先帮解决了哈。

1. xml 过滤问题

tudou的广告在一个 xml 中:

Code: Select all

http://adcontrol.tudou.com/adcontrol/adcontrol?juid=b28a1udnsr8&itemId=21166680&sourceId=18000&userId=0&adPlay=0,0&rand=7651&channelId=102
<?xml version='1.0' encoding='UTF-8'?>
<r a='411000' c='102' v='0'>
<ads aid='2778' lk='http://www.nivea4men.cn/redirect.aspx?u ... 2761200ED5}' id='3427' n='0' oid='100287' p='0.02' type='5' d='' dt='' su='http://www.nivea4men.cn/redirect.aspx?u ... 2761200ED5}' title='0508&#40657;&#35910;&#32972;&#26223;'>
http://img01.p2v.tudou.com/sales//mater ... 847866.swf
</ads>
<ads aid='3114' lk='http://www.redbanana.cn/ad/api/tjapi.php?fid=4&sid=355' id='3069' n='0' oid='100493' p='0.08' type='1' d='15' dt='15' su='' title='&#32511;&#33590;&#40657;&#35910;&#21069;&#36148;090403'>
http://61.164.125.210/flv/028/566/816/2 ... /816/w.jpg
</ads>
</r>
替换<ads aid=*</ads>,limit足够,就是不工作。

xml 不在默认过滤之列,可 $TYPE(oth) 是干吗的,不是说过滤其他类型么?$TYPE(oth)帮助里说:
For more complex content-type checks you can also use "$IHDR(Content-Type: ... )" where "..." is any matching expression including wildcards.
这个 $IHDR(Content-Type: ... ) 怎么用?$IHDR(Content-Type: text/xml )不行,$IHDR(Content-Type: * )也不行,这是怎么用的?能实现过滤 xml 么。

我知道修改 text/xml 为 text/htm 可以实现过滤,可这么改会让好多网站调用不正常。怎么能不修改 header 过滤 xml 呢?如果需要过滤一个网站的 xml,还需要它能正常调用,该怎么办?限定网站也不行时候怎么弄。
User avatar
cre
Moderator
Posts: 91
Joined: May 26 2009, 00:34

Re: xml 过滤及嵌套匹配问题

Post by cre »

2. 嵌套匹配问题

规则如下:

Code: Select all

[Patterns]
Name = "Div id|class|style"
Active = TRUE
Limit = 1024
Match = "$NEST(<div \3=$AV(\2)>,</div>) ($TST(\2=$LST(ADDIV))($SET(4=id)|$SET(5=class)|$SET(6=style)))"
ADDIVList写:

Code: Select all

HeaderAd $SET(3=4)
以下代码测试成功

Code: Select all

<div id="HeaderAd">
12345</div>
以下代码测试失败

Code: Select all

<div id="HeaderAd">
12345<div id=1234>12345</div>
</div>
为什么不能嵌套了?遇到里面有div标签就test不匹配?我要匹配嵌套应该怎么办?
User avatar
cre
Moderator
Posts: 91
Joined: May 26 2009, 00:34

Re: xml 过滤及嵌套匹配问题

Post by cre »

顺便再问下,怎样使指定网站含某关键词的不被过滤 :oops: 比如 ad[^.]++.js 怎样不匹配 read.js add1.js ?

自己弄了几天倒也土法实现了,可老觉得经常出问题。现在用的是:

Code: Select all

?++(([^r][^e])&([^l][^o]))ad[^d.]+.js*
ddbb
Moderator
Posts: 425
Joined: Jan 07 2008, 13:30

Re: xml 过滤及嵌套匹配问题

Post by ddbb »

第1个 header 我没研究过.......召唤ph...........

第2个说说我个人看法.......我觉得你那个有问题.....你用 HeaderAd $SET(3=4) 的目地是什么?? 让前面的HeaderAd能对应多个方式么.....可是目前看好像做不到.....3里只能放一个值....也就是如果又有class又有id的话你还是要写两行.......那这个就没什么意义了吧.......还不如直接写 id=$AV(HeaderAd) 这把这两个看成一个变量来看......或者是只写一个$AV(HeaderAd) 然后在规则里判断的时候把那几种全判断掉.......总之就是不用写成你那样.....如果你换个写法你就能看出你的问题在哪了.......
User avatar
cre
Moderator
Posts: 91
Joined: May 26 2009, 00:34

Re: xml 过滤及嵌套匹配问题

Post by cre »

HeaderAd $SET(3=4)的目的是确定 headerad 是 id 还是 class 。

Code: Select all

$NEST(<div (id|class|style)=$AV(LST(DIV))>,</div>)
这样写不管你是啥都要砍掉。总不能写仨规则调用三个列表吧。。。。
HeaderAd $SET(3=4) 这个是在列表文件写的。

前面的 HeaderAd 能对应多个方式么.....可是目前看好像做不到.....
----
这个好像做到啦,就是嵌套就不行。

3里只能放一个值。哎。也就是如果又有 class 又有 id 的话我加个*

Code: Select all

Match = "$NEST(<div \3=$AV(\2)>,</div>) ($TST(\2=$LST(ADDIV))($SET(4=id)|$SET(5=class)|$SET(6=style)))"
变成

Code: Select all

Match = "$NEST(<div \3=$AV(\2)*>,</div>) ($TST(\2=$LST(ADDIV))($SET(4=id)|$SET(5=class)|$SET(6=style)))"
可以么?反正....试试。
这个 $NEST(<div (id|class|style)=$AV(LST(DIV)*)>,</div>) 有*时候可以匹配id=关键字 后面class不匹配。想来我求教的加*也该可以。
主要还是嵌套不行为啥。

我用$AV其实不过是为了省略个""。汗个。如果那是 <div \3=\2>,</div>,还 $TST(\2) 那么列表就得写 "HeaderAd" $SET(3=4)
要命的是列表得写
ad $set(3=4)
"ad" $set(3=4)
$AV(ad)能匹配id="ad" id=ad阿。

我就想能在里面有嵌套还能用。ddbb 兄告诉我错在哪里吧。现在只能说这个是只支持一层div。搞笑我要的不是这效果阿。
现在就是
匹配
<div id=1><div id=headerad></div></div>
得<div id=1></div>

<div id=headerad><div id=1></div></div>
就不匹配了。
就要这个也能匹配就行。ddbb先生能帮我改下符合要求嘛?先谢谢了。
User avatar
phoenix
Site Admin
Posts: 529
Joined: Dec 29 2007, 16:27

Re: xml 过滤及嵌套匹配问题

Post by phoenix »

why wrote:xml 不在默认过滤之列,可 $TYPE(oth) 是干吗的,不是说过滤其他类型么?
要强制过滤其他类型,必须在 header filter 中使用 $FILTER(1) 命令。$TYPE(oth) 是告诉 web filter 过滤被强制过滤的类型,而不过滤默认的 html ,js 等类型。
why wrote:这个 $IHDR(Content-Type: ... ) 怎么用?$IHDR(Content-Type: text/xml )不行,$IHDR(Content-Type: * )也不行,这是怎么用的?能实现过滤 xml 么。
举个例子:

Code: Select all

[HTTP headers]
In = TRUE
Out = FALSE
Key = "Content-Type: Force Filter Specific URL (In)"
URL = "adcontrol.tudou.com"
Match = "\1"
Replace = "\1$FILTER(1)"
上面的规则会强制过滤所有以 adcontrol.tudou.com 开头的 URL。本例中,我特意没有限制 Content-Type ,表示该规则除了会过滤 adcontrol.tudou.com 下的 xml 文件,还会过滤 jpg、zip 等二进制文件。显然,通常情况下过滤二进制文件是没有必要的,下面的规则中,我就通过 $IHDR() 命令来限制该 web filter 所要过滤的文件类型。

Code: Select all

[Patterns]
Name = "Filter Tudou XML"
Active = TRUE
URL = "$TYPE(oth)$IHDR(Content-Type: text/xml)adcontrol.tudou.com/"
Bounds = "<ads*</ads>"
Limit = 512
Match = "*"
注意 $TYPE(oth) 表示其将过滤被 $FILTER(1) 强制过滤的类型,$IHDR(Content-Type: text/xml) 进一步限制其只过滤 text/xml 类型。
why wrote:如果需要过滤一个网站的 xml,还需要它能正常调用,该怎么办?
如果你过滤掉的内容正好是网站需要的,那么网站功能可能会不正常。这时候要灵活处理,比如不将内容直接删除,而是修改为其他内容。
User avatar
cre
Moderator
Posts: 91
Joined: May 26 2009, 00:34

Re: xml 过滤及嵌套匹配问题

Post by cre »

感谢 phoenix 的解答。

$FILTER() 懂了。布尔值,刚试了下,只在 ture,非0数字和t开头才可以,不一定要1可其他的都当false吧。受益匪浅。帮助是也看了,只是那时不理解。例子出来马上理解了。

$IHDR() 只是限定类型的并不能匹配原本不匹配的我没理解错吧。还是得实例说明。帮助这玩意看的的确头大。

正常调用那一说是因为修改了Content-Type造成调用不了。。。。谢谢,xml这个问题已经解决了。能看看别的么。

汗,才发现土豆很绝呀,多刷几次它就不显示广告了。怕人看了去广告?还是同一ip广告点击多也没用就施恩于我等小民?这可真是个好办法。没事先把那xml刷个10余下就....
User avatar
cre
Moderator
Posts: 91
Joined: May 26 2009, 00:34

Re: xml 过滤及嵌套匹配问题

Post by cre »

顺便再请问个,关于网站禁止缓存问题,可以用 proxomitron 做到解禁么?

比如hd.tudou.com随便个视频如 http://hd.tudou.com/program/5640/ ,缓存内找不到js等。官方那个允许缓存似乎没用,应该如何搞呢?
ddbb
Moderator
Posts: 425
Joined: Jan 07 2008, 13:30

Re: xml 过滤及嵌套匹配问题

Post by ddbb »

你回了那么那么长一段.....我还是没看明白你为什么要用 $SET(3=4)

你看明白我在上面说什么了么......你为什么不直接在 blocklist 里写 class=$AV(aaaa)

而要写一个没有必要的 $SET(3=4)
User avatar
phoenix
Site Admin
Posts: 529
Joined: Dec 29 2007, 16:27

Re: xml 过滤及嵌套匹配问题

Post by phoenix »

关于嵌套匹配问题,why 的规则到底想实现什么我也没搞清楚,我只说说为什么2楼里的第2段代码测试失败。

将代码修改如下再去测试第2段代码:

Code: Select all

[Patterns]
Name = "Div id|class|style"
Active = TRUE
Limit = 1024
Match = "$NEST(<div \3=$AV(\2)>,</div>)"
Replace = "\2"
可以发现 \2 的值变成了 1234 。也就是说嵌套的匹配是成功的,而 \2 的值变成最内层的属性值,从而导致后面的 $TST() 失败。
Post Reply