Board logo

标题: 关于过滤规则的几点疑问 [打印本页]

作者: origin    时间: 2008-6-8 22:35     标题: 关于过滤规则的几点疑问

置顶的过滤规则教程里关于正则表达式有如下表述:
  1. $i
  2. 表示前面用 () 捕获的第 i 个子表达式. i = 1, 2, 3...
  3. 例: $1 表示前面用 <a[^>]*?href=(".*?")[^>]*?> 捕获 <a href="http://bbs.ioage.com/">
  4. 得到的 "http://bbs.ioage.com/" 部分. 用于 replace 及 return 部分
复制代码


实践证明这里的$i似乎应为\i

1、正则表达式的种类似乎太多(比如微软的MSDN里提到的、Perl正则表达式、Unix正则表达式、UltraEdit正则表达式等等,奇怪的是微软的VS2008编辑器用的正则表达式似乎和MSDN里提到的不完全相同),虽然大同小异,但这些“小异”往往会造成很多麻烦。论坛是不是出一个由开发者提供的正则表达式规范?

2、广告过滤时,似乎只能利用正则表达式来检索,而不能用来替换。举个例子,比如我要把
  1. <a href="path1...">xxx</a>
复制代码
的内容(其中xxx是任意合乎html规范的内容)替换成
  1. <a href="path2...">xxx</a>
复制代码

按照一般正则表达式的理解,只需写成如下
  1. #ex#<a href="path1([^"]*?)">([^<]*>)</a>#<a href="path2\1">\2</a>
复制代码
即可。遗憾的是目前版本的TW不支持这么干。
作者: yuyuye    时间: 2008-6-11 08:12

第一个:
\i 用于在正则表达式中引用
$i 用于替换
支持楼主,希望开发组明确TW所采用的RE引擎。

第二个:
正如第一个所说,替换部分不应该用 \i,换成 $i 就对了
作者: elkay    时间: 2008-6-11 17:33     标题: 回复 1# origin 的帖子

1.很明显,你没有实践

2.很明显可以,还是说明你没有仔细看1
  1. #ex#<a href="path1([^"]*?)">([^<]*>)</a>###<a href="path2$1">$2</a>
复制代码

作者: 狄烁stec    时间: 2008-6-11 18:32

教程说的很清楚:$i是用在替换部分,\i则用在匹配表达式里面.
<([^>]+)>.*?<\/\1>
可以匹配<p>abc</p>,<scrpt>.....</script>这样的文本

1.
正则表达式发展到现在有很多流派,不同的流派又有很多软件,他们的实现方法不同,并加入了各自认为应该有的功能,所以就出现了楼主说的"小异".

2.
elkay版主已经给出了答案.
个人认为第二个捕获有点问题.
  1. #ex#<a href="path1([^"]*)">([^<]*)</a>###<a href="path2$1">$2</a>
复制代码

作者: origin    时间: 2008-6-12 21:41

过滤本页的源码的<html xmlns="http://www.w3.org/1999/xhtml">
  1. #ex#<html xmlns=(['"])([^'"]*?)$1>###<html $2>
复制代码
过滤,结果不变<html xmlns="http://www.w3.org/1999/xhtml">

  1. #ex#<html xmlns=(['"])([^'"]*?)\1>###<html $2>
复制代码
过滤,结果为<html http://www.w3.org/1999/xhtml>,满足要求

  1. #ex#<html xmlns=(['"])([^'"]*?)\1>###<html \2>
复制代码
过滤,结果为<html \2>

智商有限,就只贴试验结果,不加评论了
作者: elkay    时间: 2008-6-13 13:48     标题: 回复 3# origin 的帖子

不同的情况下要有不同的使用方法
作者: origin    时间: 2008-6-13 19:54     标题: 回复 4# elkay 的帖子

所以有了顶楼1号要求
作者: needed    时间: 2008-6-14 09:32

\n 捕获的是  正则规则缓冲区
$n 指的是后向引用...

不同的概念别混淆了..

### 后的 \1 不会有任何东西的...




欢迎光临 世界之窗论坛 (http://bbs.theworld.cn./) Powered by Discuz! 7.2