Page 1 of 1
能否在一个规则里匹配多个图片
Posted: Nov 19 2008, 17:37
by ddbb
比如有这样一段代码
Code: Select all
<div class="postbody clearfix">
<img src="/images/smiles/icon_redface.gif"/>
</div>
我想改这个div里面的img
我写的是
Code: Select all
[Patterns]
Name = "test"
Active = TRUE
URL = ""
Bounds = "<div class="postbody clearfix"></div>"
Limit = 2000
Match = "\1<img\2 src="\3"\4/>\5"
Replace = "\1<img\2 src="\3"\4 onload="if(this.width>'760')this.width='760';" onclick="if(this.width>=760) window.open('\3');"/>\5\n"
现在的问题就是这个div里有可能有多个图片 而我这个规则只能改里面的第1个图片 后面的就不能改了......
而div外面的图片我不想改.......
有没有什么办法把div里面的图片全都改掉呢............
Re: 能否在一个规则里匹配多个图片
Posted: Nov 19 2008, 19:00
by phoenix
提供下思路:
- 检测到目标div起始标记时,设置一个全局变量
- 检测到div结束标记时,取消该全局变量
- 对每一个img标记,测试该全局变量是否存在。如果存在,则说明在该div内,规则匹配;如果不存在,则说明不在该div内,规则不匹配
规则完成,记得分享下。

Re: 能否在一个规则里匹配多个图片
Posted: Nov 20 2008, 11:24
by ddbb
按照你的思路........
写了3个规则..........
简单的TEST了一下.....好像是可以的........
你看看规则写得怎么样.........
个人感觉这样写是不是太浪费了........用了3个规则才搞定..........
Code: Select all
[Patterns]
Name = "javaeye Image Width Update Bigen"
Active = TRUE
URL = "$TYPE(htm)www.javaeye.com/topic/|$TYPE(htm)www.javaeye.com/post/"
Limit = 40
Match = "<div class="postbody clearfix">$SET(IWUpdate=ok)"
Replace = "<div class="postbody clearfix">\n"
"<!-- javaeye Image Width Update Bigen -->\n"
Name = "javaeye Image Width Update"
Active = TRUE
URL = "$TYPE(htm)www.javaeye.com/topic/|$TYPE(htm)www.javaeye.com/post/"
Limit = 1000
Match = "<img\1 src="\2"\3/> $SET(0=$TST(IWUpdate=ok) onload="if(this.width>'760')this.width='760';" onclick="if(this.width>=760) window.open('\2');")"
Replace = "<!-- javaeye Image Width Update Start -->\n"
"<img\1 src="\2"\3 \0/>\n"
"<!-- javaeye Image Width Update End -->\n"
Name = "javaeye Image Width Update Over"
Active = TRUE
URL = "$TYPE(htm)www.javaeye.com/topic/|$TYPE(htm)www.javaeye.com/post/"
Limit = 10
Match = "</td>$SET(0=$TST(IWUpdate=ok) <!-- javaeye Image Width Update Over -->\n)$SET(IWUpdate=$TST(IWUpdate=ok) no)"
Replace = "\0</td>\n"
Re: 能否在一个规则里匹配多个图片
Posted: Nov 21 2008, 09:27
by phoenix
给个实际的网页代码,我帮你看下。
Re: 能否在一个规则里匹配多个图片
Posted: Nov 21 2008, 12:46
by ddbb
http://www.javaeye.com/topic/269043
1楼有3张图片.........
好像是可以的............
我就是有点点担心性能......
因为我结束的那个用的是</td>
这样匹配的就会非常多..........
Re: 能否在一个规则里匹配多个图片
Posted: Nov 22 2008, 21:40
by phoenix
试试:
Code: Select all
[Patterns]
Name = "javaeye Image Width Update"
Active = TRUE
URL = "$TYPE(htm)www.javaeye.com/(topic|post)/"
Limit = 256
Match = "<div class="postbody clearfix">$SET(isFound=1)PrxFail"
"|<img$TST(isFound=1)\1src=$AV(\2)\3>"
"|</div>(^\s<script)$TST(isFound=*)$SET(isFound=)PrxFail"
Replace = "<img onload="if(this.width>'760')this.width='760';" onclick="if(this.width>=760) window.open('\2');" \1src="\2"\3>"
如果不加onclick语句,另一种写法:
Code: Select all
[Patterns]
Name = "javaeye Image Widht Update Alternative"
Active = TRUE
URL = "$TYPE(htm)www.javaeye.com/(topic|post)/"
Limit = 2600
Match = "<div class="postbody clearfix">$INEST(<div,</div>)</div>&&(\#<img\s$SET(\#=<img onload="if(this.width>'760')this.width='760';" )([^>]+>)\#)+\#"
Replace = "\@"
Re: 能否在一个规则里匹配多个图片
Posted: Nov 24 2008, 10:10
by ddbb
学到了新的写法.........
感谢..............
第一个基本能看得懂..........就那个PrxFail 我在帮助文件里都没有搜到......意思是有这个之后就不会做Replace么.......
至于第2个.......学到了里面的\#和\@ 我比较好奇的是.......这个为什么能匹配到多个图片......而不是只匹配第一个....
按照我的理解 他应该也是只匹配到第1个的吧..........
Re: 能否在一个规则里匹配多个图片
Posted: Nov 24 2008, 11:13
by phoenix
ddbb wrote:就那个PrxFail 我在帮助文件里都没有搜到......意思是有这个之后就不会做Replace么.......
前半部分的匹配使我们可以成功设置一个变量,加PrxFail后让整条规则不匹配,就不用在Replace部分加处理语句了。sidki-etc\Techniques.txt 中有说到这个技巧。
ddbb wrote:至于第2个.......学到了里面的\#和\@ 我比较好奇的是.......这个为什么能匹配到多个图片......而不是只匹配第一个....
注意那个
+ 使前面
蓝色括号中的内容多次循环,从而匹配到多个图片。
(\#<img\s$SET(\#=<img onload="if(this.width>'760')this.width='760';" )([^>]+>)\#)+\#