php 获取网页内的图片地址正则表达式

获取网页中的图片地址并保存下载我们需要采集页面,然后再利用正则表达式获取页面中的图片url,然后我们再通过相关的php函数把图片保存到指定本地硬盘了.

1.获取地址

这个功能最主要的就是用正则表达式来匹配页面源码里的图片地址了,这里用到得正则表达式是:

/<img.*src="(.*)"\s*.*>/iU

首先通过PHP自带的读取文件函数来获得请求页面的html代码,然后用正则表达式来匹配里面的src地址,这里有两个注意点:

file_get_content

只能获取到静态的页面内容,也就是说如果你在页面里看到的是图片是通过Javascript来展示的,通过这个工具是获取不到图片信息的.

有的网站对file_get_content 这个函数做了些限制,如果不是通过浏览器打开的网页,服务器是拒绝请求的,这个时候我们就需要给php 程序添加一个配置信息,让采集的程序能够模拟一个留言器的UA(user agent),具体的做法可以通过下面的代码来实现://现在模拟的是一个Window 环境下的浏览器

ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; 4399Box.560; .NET4.0C; .NET4.0E)');

通过以上两点的处理,获取网页源码就没有问题了,唯一要做的就是用正则表达式对图片地址的匹配.

例子1,代码如下:

  1. /**
  2. * 获取替换文章中的图片路径
  3. * @param string $xstr 内容 采集网页的content
  4. * @param string $keyword 创建照片的文件名 我写upimg
  5. * @param string $oriweb 网址 一般写null
  6. * @return string
  7. *
  8. */
  9. function replaceimg($xstr,$keyword, $oriweb){
  10. $basedir = dirname(__FILE__);
  11. //保存路径
  12. $d = date('Ym', time());
  13. $dirslsitss = $basedir.'/../uploads/'.$keyword.'/'.$d;//分类是否存在
  14. if(!is_dir($dirslsitss)) {
  15. @mkdir($dirslsitss, 0777);
  16. }
  17. //匹配图片的src
  18. preg_match_all('#<img.*?src="([^"]*)"[^>]*>#i', $xstr, $match);
  19. foreach($match[1] as $imgurl){
  20. $imgurl = $imgurl;
  21. if(is_int(strpos($imgurl, 'http'))){
  22. $arcurl = $imgurl;
  23. } else {
  24. $arcurl = $oriweb.$imgurl;
  25. }
  26. $img=file_get_contents($arcurl);
  27. if(!emptyempty($img)) {
  28. //保存图片到服务器
  29. $fileimgname = time()."-".rand(1000,9999).".jpg";
  30. $filecachs=$dirslsitss."/".$fileimgname;
  31. $fanhuistr = file_put_contents( $filecachs, $img );
  32. $saveimgfile = "/uploads/$keyword"."/".$d."/".$fileimgname;
  33. $xstr=str_replace($imgurl,$saveimgfile,$xstr);
  34. }
  35. }
  36. return $xstr;
  37. }

可能有些朋友也知道file_get_contents性能不怎么样,我们可使用curl来获取,代码如下:

  1. /*
  2. *功能:php完美实现下载远程图片保存到本地
  3. *参数:文件url,保存文件目录,保存文件名称,使用的下载方式
  4. *当保存文件名称为空时则使用远程文件原来的名称
  5. */
  6. function getImage($url,$save_dir='',$filename='',$type=0){
  7. if(trim($url)==''){
  8. return array('file_name'=>'','save_path'=>'','error'=>1);
  9. }
  10. if(trim($save_dir)==''){
  11. $save_dir='./';
  12. }
  13. if(trim($filename)==''){//保存文件名
  14. $ext=strrchr($url,'.');
  15. if($ext!='.gif'&&$ext!='.jpg'){
  16. return array('file_name'=>'','save_path'=>'','error'=>3);
  17. }
  18. $filename=time().$ext;
  19. }
  20. if(0!==strrpos($save_dir,'/')){
  21. $save_dir.='/';
  22. }
  23. //创建保存目录
  24. if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
  25. return array('file_name'=>'','save_path'=>'','error'=>5);
  26. }
  27. //获取远程文件所采用的方法
  28. if($type){
  29. $ch=curl_init();
  30. $timeout=5;
  31. curl_setopt($ch,CURLOPT_URL,$url);
  32. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  33. curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  34. $img=curl_exec($ch);
  35. curl_close($ch);
  36. }else{
  37. ob_start();
  38. readfile($url);
  39. $img=ob_get_contents();
  40. ob_end_clean();
  41. }
  42. //$size=strlen($img);
  43. //文件大小
  44. $fp2=@fopen($save_dir.$filename,'a');
  45. fwrite($fp2,$img);
  46. fclose($fp2);
  47. unset($img,$url);
  48. return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
  49. }