阅读:6007回复:1
使用定向排除(negative look-ahead)功能建立adblock白名单
adblock出来很久了,最近才出现自带白名单功能的hack nightly版,但是
正则表达式中定向排除的运用,可以在一定程度上实现这个功能,而且也省去 了多个规则"黑白分明"造成cpu判断上的负荷(猜测……)。 由于本来就没有很多需要白的内容,一直对negative look-ahead功能也是 浅尝辄止,最近仔细研究了一下,有了一些心得。 negative look-ahead,定向排除,而且是ahead,就是向前排除, negative look-behind并不被javascript支持,这也增加了正则表达式的 编写难度。 negative look-ahead 以一个问号和一个感叹号开头: ?! 例如: plac(?!ard)/ 含义是,搜索plac这几个字母,并且匹配除了后面是ard的任何字串,所以 place, placed都匹配,而placard这个单词不匹配 也允许或逻辑,例如 plac(?!(ard)|(ed)) 这样placed, placard一律被排除,只有place匹配 基本功能就是这些,注意有一些容易写错的地方: ?!外必须有括号,所以定向排除的语句段都是形如 (?!要排除字段) 还有似乎含有定向排除的表达式如果位于一个很复杂的表达式之中, 会得不到预期的效果(弄不明白为什么),哪怕单独测试可以,用 或逻辑跟其他规则整合也总出问题。 再举几个例子: \/(\w(?!bg))*\.jpg 匹配"/"号以后一切[A-z0-9]任意次并以.jpg结尾的图片链接,例如 /wild.jpg, /wilders.jpg,唯独文件名以bg结尾的jpg文件例外: /catbg.jpg 或者这样写 \/(.(?!bg))*\.jpg 匹配"/"号以后一切字符任意次并以.jpg结尾的图片链接,唯独文件名以bg结尾的jpg文件例外, 原因是大部分以bg结尾的图片需要保留。 注意这里(?!bg)放的位置很有特点,就当作一个字符放在通配符.号的后面 并一起参与*号的次数匹配, 而不是我当时认为的放在*号的后面,也就是说这样的表达式是错误的: (.*(?!bg))\.jpg 而且如果使用了如"."或者"\w"的通配符的话,最前面一定还要有明确的 字符,否则就出错,例如上面的表达式 \/(\w(?!bg))*\.jpg 如果去掉\/这两个字母成为: (\w(?!bg))*\.jpg 就无法排除不带"/"号的catbg.jpg,不但如此,正则表达式练习器单步测试 的结果显示就是找到了bg.jpg,这一点相当“神奇”,一定要注意。 暂时写这些,希望对大家有所帮助,不过大家已经可以开始用带白名单的 adblock了,或许这样的事情就不用深究了(说实话是真难学……) |
|
|
1楼#
发布于:2005-04-29 03:51
没什么难学的,但正如你所说,遇到复杂的表达式时?!似乎会不起作用.而我用上白名单后就能把问题解决了,爽.
不过大哥你的这个技巧还是有用处的,可以在黑名单中排除一些简单的例外而不用再另起炉灶编一个白名单,是吧.而且也很简单(?!……)就是了,简单易学. |
|
|