发新话题
打印

[采集规则?] 采集中的正则说明教材(欢迎查阅和提问)[公告]

首先说明一下读吧采集规则中正则表达式的基本结构。
以“|<a href="view_book\.asp\?id=(\d+)" title=.*>(.*)</a>|isU”为例。

开始和末尾的“|”和“|isU”,是起始符和结束符,必须得跟上,其含义无需了解。

中间部分,就是相应的字符串了。字符串含义:
复制内容到剪贴板
代码:
小括号((和))括起来的,就是要匹配出来的内容,不括就不匹配。

点号(.)表示任意字符。

\d 表示数字。

星号(*)表示任意长度0个到无数个。

加号(+)表示任意长度1个到无数个。

问号(?)表示任意长度0个到1个。
如上所言的字符串或字符由于都有特定含义,所以如果在要匹配的字符串中出现上述字符,就需要转义,即用转义符“\”放在前面表示后面跟着的是一个符号。
而3.3中,细心的朋友可以发现“/”前面不再需要转义符了,因为起始结束符使用了“|”而不是原来的“/”,所有不会和内容里面的“/”冲突了,就不再需要進行转义了。

所以原字符串为“<a href="view_book.asp?id=1234" title=xxxxx>xxxxxxxxxx</a>”,匹配1234和xxxxxxxxxx的正则就为“<a href="view_book\.asp\?id=(\d+)" title=.*>(.*)</a>”,其中.和?需要转义,所以前面带了斜划线。

另举例:
匹配“<a href="(view_book).asp?id=1234" title=xxxxx>xxxxxxxxxx</a>”,匹配的正则就应该是“<a href="\(view_book\)\.asp\?id=(\d+)" title=.*>(.*)</a>”。注意前面的括号因为代表的是字符串中的字符,所以需要加上转义符匹配。

另外提供给大家一个示范代码,可以用来检测自己写的正则是否正常:

将一下内容保存为a.php文件,上传到服务器上运行查看结果即可知能否匹配出来以及匹配的结果是否正常:
复制内容到剪贴板
代码:
<?
$a='
<a href="view_book.asp?id=218192" title="本章字数:5460

更新日期:2007-6-10 14:14:09">2、魔鬼亲临的童年</a></td>
';

$b='|<a href="view_book\.asp\?id=(\d+)" title=.*>(.*)</a>|isU';

preg_match_all($b, $a ,$a);
print_r($a);
其中这个“$a=”后面,“;”的前面,两者中间写上你要检测的匹配字符串。
这里“$b=”后面,“;”前面写上你的正则。

TOP

Good job!!

书生这个一出,新手对采集估计就大致不会有多少问题了!


赞!!!

TOP

Notice: Undefined variable: Bookreviewblock in xx/0775mh.cn/public_html/hao123/modules/task/cache_data.task.php on line 103

TOP

这是什么问题呀

TOP

不过上面那个代码 在运行后的 结果 看不太懂 怎么才算匹配成功呢 或者说可以匹配?


还有 这个代码 能检查3.1的正则吗>

TOP

回3楼:其他问题勿在此咨询。

楼上:你看那个源代码,如果输出的数组里面有内容,并且那个[1]和[2]中匹配出你要匹配的值,那就是正常。你换一个错误的表达式看看效果就知道了。输出的全是空。就是[1]=''这样,没内容。这就说明没匹配到。

TOP

图片版的怎么采集?我设置好只能顺利踩到文字。到图片版的就出错了。

TOP

图片的程序自动判断抓取。你需要保证采集规则无错。稍后我们官方会提供含图片的采集示范规则。

TOP

发新话题