正则表达式是一个很重要的东西,他被应用到字符串的解析,提取,替换等各个方面。
今天又一次学习php正则表达式,借此机会,来做一个批量下载jpg的脚本工具(实际上就是一个函数)。
先介绍一下写出的函数,小诱惑一下:
函数有一个参数就是某个url的网址,然后函数的功能是从该url的html中匹配出jpg链接,然后下载到本地的pics文件夹,同时遍历html中的a标记,以此解析出相应的href,再进行上次操作,这样一个jpg爬虫(姑且这么叫吧)爬行的第一步就做好了。我们要实现的就是这一步。如果你选择的url链接较多或者图片较多,估计会运行很长时间。看过社交网络的人应该都知道,facebook刚开始起源的时候是从一个评判美女的程序开始的,而解决图片源也是通过一段代码,下载下来的jpg图片。当然如果我们愿意我们可以让这个爬虫多爬几次,这样我们就可以搞到很多很多的图片了。应该很酷吧!
先说说正则表达式的几个概念:
正则表达式的语法规则:PHP中的正则表达式包含在两个定界符之间,之间放的是模式字符串也就是正则表达式的关键部分。在两个定界符之后,也许会有若干个模式修正符,来增强正则表达式的功能。先说定界符,除了字母数字和正斜线之外的任何字符都可以做外定界符。定界符内部就是原子的天下了,原子由那些未显示为元字符的打印和非打印字符组成,包括了所有的大小写字母,数字,标点符号和其他符号。另外还包含了一些非打印字符,非打印符可以去查询正则表达式的相关文档。上边提到了元字符,元字符是用于构建正则表达式的具有特殊含义的字符,例如常用的*+?等。
元字符很关键,他可以让你的正则表达式简单准确。通用字符类型元字符就是他可以代替一些字符:比如说\d代表数字0-9,\D用来匹配除数字以外的字符。还有很多有用的通用字符元字符可以查看文档。个数限定符,比如说{n},{n,m},{n,},+,*等每个都由每个的含义解决的是出现几个前边出现的字符的情况。边界限定符^,$分别用来匹配开头和结尾。还有一个可以用来统计单词个数的单词结尾\b。句号.被用来匹配任意的一个字符。模式选择,有时候需要用到或的关系|用来匹配两个原子之中的一个。运用[]可以匹配其中的一个。模式单元()将一组表达式作为一个整体来引用,同时还可以后向引用。
最后就是模式修正符了,再定界符的后边加上一些字符可以完成特殊匹配,比如:
i忽略大小写,U贪婪模式最大限度匹配。
注:本文只是简单介绍一下正则表达式,读者还是去找个详细的地方学习一下比较好。
下面来开始实现我们的东西,先读取一个url对应的html,这个工作php已经帮我们做好了,php允许读取远程服务器的文件,读取到的就是该网页的html,然后重要的是几个正则表达式,分别是匹配出所有的a链接,匹配出其中的网页,匹配出页面中所有的jpg链接。
正则表达式应该是有错,然后将匹配的结果进行了一下处理。
$reg=’/http:\/\/[^\s\"]*\.jpg/’; //匹配图片url的正则表达式
$reg=’/<a[^>]+>/’; //匹配a标签的正则表达式
$reg2=’/http:\/\/[^\s\"]*/’; //匹配网页链接的正则表达式
函数代码实现如下:
//主函数主要进行解析出其中的a链接和链接地址,当然还包含了下载当前url中的所有jpg图片
function jpg_spider($url) {
download_jpg($url);
$reg=’/<a[^>]+>/’;
preg_match_all($reg,file_get_contents($url),$matches);
foreach($matches[0] as $v){
$reg2='/http:\/\/[^\s\"]*/';
preg_match($reg2,$v,$m);
// echo $m[0];
if($m[0]!=''){
download_jpg($m[0]);
}
}
}
//下载一个页面中的jpg,参数是url
function download_jpg ( $url ) {
$reg='/http:\/\/[^\s\"]*\.jpg/';
$str=file_get_contents($url);
preg_match_all($reg,$str,$matches);
$matches=$matches[0];
static $i=0;
foreach ($matches as $v){
// echo $v;
// echo '';
$m=file_get_contents($v);
if($m!=''){
$f='pics/fi'.$i.'.jpg';
$i++;
file_put_contents($f,$m);
}
}
}
注:运行时间可能很长,可能需要修改php中的脚本的运行时间 |