能否在一个规则里匹配多个图片

新手入门、经验交流

Moderator: cre

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

能否在一个规则里匹配多个图片

Post 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里面的图片全都改掉呢............
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

Re: 能否在一个规则里匹配多个图片

Post by phoenix »

提供下思路:
  1. 检测到目标div起始标记时,设置一个全局变量
  2. 检测到div结束标记时,取消该全局变量
  3. 对每一个img标记,测试该全局变量是否存在。如果存在,则说明在该div内,规则匹配;如果不存在,则说明不在该div内,规则不匹配
规则完成,记得分享下。 :D
ddbb
Moderator
Posts: 425
Joined: Jan 07 2008, 13:30

Re: 能否在一个规则里匹配多个图片

Post 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"

User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

Re: 能否在一个规则里匹配多个图片

Post by phoenix »

给个实际的网页代码,我帮你看下。
ddbb
Moderator
Posts: 425
Joined: Jan 07 2008, 13:30

Re: 能否在一个规则里匹配多个图片

Post by ddbb »

http://www.javaeye.com/topic/269043

1楼有3张图片.........

好像是可以的............

我就是有点点担心性能......

因为我结束的那个用的是</td>

这样匹配的就会非常多..........
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

Re: 能否在一个规则里匹配多个图片

Post 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 = "\@"
ddbb
Moderator
Posts: 425
Joined: Jan 07 2008, 13:30

Re: 能否在一个规则里匹配多个图片

Post by ddbb »

学到了新的写法.........
感谢..............

第一个基本能看得懂..........就那个PrxFail 我在帮助文件里都没有搜到......意思是有这个之后就不会做Replace么.......

至于第2个.......学到了里面的\#和\@ 我比较好奇的是.......这个为什么能匹配到多个图片......而不是只匹配第一个....
按照我的理解 他应该也是只匹配到第1个的吧..........
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

Re: 能否在一个规则里匹配多个图片

Post 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';" )([^>]+>)\#)+\#
Post Reply