php 擷取網頁內的圖片地址Regex

來源:互聯網
上載者:User


1. 擷取地址
這個功能最主要的就是用Regex來匹配頁面源碼裡的圖片地址了,這裡用到得Regex是:

 代碼如下 複製代碼

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

首頁通過PHP內建的讀取檔案函數來獲得請求頁面的html代碼,然後用Regex來匹配裡面的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)');
通過以上兩點的處理,擷取網頁源碼就沒有問題了,唯一要做的就是用Regex對圖片地址的匹配。

例子1

 代碼如下 複製代碼

/**
 * 擷取替換文章中的圖片路徑
 * @param string $xstr 內容 採集網頁的content
 * @param string $keyword 建立照片的檔案名稱 我寫upimg
 * @param string $oriweb 網址 一般寫null
 * @return string
 *
 */
function replaceimg($xstr,$keyword, $oriweb){
 $basedir = dirname(__FILE__);
 
    //儲存路徑
    $d = date('Ym', time());
    $dirslsitss = $basedir.'/../uploads/'.$keyword.'/'.$d;//分類是否存在
    if(!is_dir($dirslsitss)) {
        @mkdir($dirslsitss, 0777);
    }
 
    //匹配圖片的src
    preg_match_all('#<img.*?src="([^"]*)"[^>]*>#i', $xstr, $match);
 
    foreach($match[1] as $imgurl){
 
        $imgurl = $imgurl;
 
        if(is_int(strpos($imgurl, 'http'))){
            $arcurl = $imgurl;
        } else {
            $arcurl = $oriweb.$imgurl;       
        }
        $img=file_get_contents($arcurl);
 
 
        if(!empty($img)) {
 
            //儲存圖片到伺服器
            $fileimgname = time()."-".rand(1000,9999).".jpg";
            $filecachs=$dirslsitss."/".$fileimgname;
            $fanhuistr = file_put_contents( $filecachs, $img );
            $saveimgfile = "/uploads/$keyword"."/".$d."/".$fileimgname;
 
 
            $xstr=str_replace($imgurl,$saveimgfile,$xstr);
        }
    }
    return $xstr;
}

可能有些朋友也知道file_get_contents效能不怎麼樣,我們可使用curl來擷取

 代碼如下 複製代碼


/*
*功能:php完美實現下載遠程圖片儲存到本地
*參數:檔案url,儲存檔案目錄,儲存檔案名稱,使用的下載方式
*當儲存檔案名稱為空白時則使用遠程檔案原來的名稱
*/
function getImage($url,$save_dir='',$filename='',$type=0){
    if(trim($url)==''){
  return array('file_name'=>'','save_path'=>'','error'=>1);
 }
 if(trim($save_dir)==''){
  $save_dir='./';
 }
    if(trim($filename)==''){//儲存檔案名稱
        $ext=strrchr($url,'.');
        if($ext!='.gif'&&$ext!='.jpg'){
   return array('file_name'=>'','save_path'=>'','error'=>3);
  }
        $filename=time().$ext;
    }
 if(0!==strrpos($save_dir,'/')){
  $save_dir.='/';
 }
 //建立儲存目錄
 if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
  return array('file_name'=>'','save_path'=>'','error'=>5);
 }
    //擷取遠程檔案所採用的方法
    if($type){
  $ch=curl_init();
  $timeout=5;
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  $img=curl_exec($ch);
  curl_close($ch);
    }else{
     ob_start();
     readfile($url);
     $img=ob_get_contents();
     ob_end_clean();
    }
    //$size=strlen($img);
    //檔案大小
    $fp2=@fopen($save_dir.$filename,'a');
    fwrite($fp2,$img);
    fclose($fp2);
 unset($img,$url);
    return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.