返回列表 回复 发帖

基于PHP网页快照类


  1. <?PHP
  2. //====================================================
  3. //        FileName:    snap.class.php
  4. //        Summary:    网页快照类
  5. //        Author:        millken(迷路林肯)
  6. //        LastModifed:2007-06-29
  7. //        copyright (c)2007 [email]millken@gmail.com[/email]
  8. //====================================================
  9. class snap{
  10.     var $dir;
  11.     var $log;
  12.     var $contents;
  13.     var $filename;
  14.     var $host;
  15.     var $name;
  16.     var $data_ts;
  17.     var $ttl;
  18.     var $url;
  19.     var $ts;
  20.     function snap(){
  21.         $this->log = "New snap() object instantiated.<br />n";   
  22.         $this->dir = dirname(__FILE__)."/";
  23.     }
  24.     function fetch($url="",$ttl=10){
  25.         $this->log .= "--------------------------------<br />fetch() called<br />n";
  26.         $this->log .= "url: ".$url."<br />n";
  27.         $hosts = parse_url($url);
  28.         $this->host = $hosts['scheme'].'://'.$hosts['host'].'/';
  29.         if (!$url) {
  30.             $this->log .= "OOPS: You need to pass a URL!<br />";
  31.             return false;
  32.         }
  33.         $this->ttl = $ttl;
  34.         $this->url = $url;
  35.         $this->name = md5($this->url);
  36.         $this->filename = $this->dir.$this->name;
  37.         $this->log .= "Filename: ".$this->filename."<br />";
  38.         $this->getFile_ts();
  39.         $this->file_get_content();

  40.     }
  41.     function file_get_content(){
  42.         ob_start();
  43.         $this->ts = time() - $this->data_ts;
  44.         if($this->data_ts <>0 && $this->ts <= $this->ttl){
  45.             $this->log .= "cache has expired<br />";
  46.             @readfile($this->filename);   
  47.             $this->contents = ob_get_contents();
  48.             ob_end_clean();
  49.         }else{
  50.             $this->log .= "cache hasn't expired<br />";        
  51.             @readfile($this->url);   
  52.             $this->contents = ob_get_contents();
  53.             ob_end_clean();
  54.             $this->saveToCache();
  55.         }
  56.         return true;
  57.     }
  58.     function saveToCache(){
  59.         $this->log .= "saveToCache() called<br />";
  60.         //create file pointer
  61.         if (!$fp=@fopen($this->filename,"w")) {
  62.             $this->log .= "Could not open ".$this->filename."<br />";
  63.             return false;
  64.         }
  65.         $this->contents = $this->formaturl($this->contents,$this->host);
  66.         $this->contents = preg_replace("'<script[^>]*?>.*?</script>'si","",$this->contents);
  67.         //write to file
  68.         if (!@fwrite($fp,$this->contents)) {
  69.             $this->log .= "Could not write to ".$this->filename."<br />";
  70.             fclose($fp);
  71.             return false;
  72.         }
  73.         //close file pointer
  74.         fclose($fp);
  75.         return true;
  76.     }
  77.     function getFile_ts(){
  78.         $this->log .= "getFile_ts() called<br />";
  79.         if (!file_exists($this->filename)) {
  80.             $this->data_ts = 0;
  81.             $this->log .= $this->filename." does not exist<br />";
  82.             return false;
  83.         }
  84.         $this->data_ts = filemtime($this->filename);
  85.         return true;
  86.     }
  87.     function formaturl($l1,$l2){
  88.     if (preg_match_all("/(<img[^>]+src=\"([^\"]+)\"[^>]*>)|(<link[^>]+href=\"([^\"]+)\"[^>]*>)|(<a[^>]+href=\"([^\"]+)\"[^>]*>)|(<img[^>]+src='([^']+)'[^>]*>)|(<a[^>]+href='([^']+)'[^>]*>)/i",$l1,$regs)){
  89.       foreach($regs[0] as $num => $url){
  90.        $l1 = str_replace($url,$this->lIIIIl($url,$l2),$l1);
  91.       }
  92.     }
  93.     return     $l1;
  94.     }

  95.     function lIIIIl($l1,$l2){
  96.     if(preg_match("/(.*)(href|src)=(.+?)( |/>|>).*/i",$l1,$regs)){$I2 = $regs[3];}
  97.     if(strlen($I2)>0){
  98.       $I1 = str_replace(chr(34),"",$I2);
  99.       $I1 = str_replace(chr(39),"",$I1);
  100.     }else{return $l1;}
  101.     $url_parsed = parse_url($l2);
  102.     $scheme      = $url_parsed["scheme"];if($scheme!=""){$scheme = $scheme."://";}
  103.     $host      = $url_parsed["host"];   
  104.     $l3       = $scheme.$host;
  105.     if(strlen($l3)==0){return $l1;}
  106.     $path      = dirname($url_parsed["path"]);if($path[0]=="\"){$path="";}
  107.     $pos      = strpos($I1,"#");
  108.     if($pos>0) $I1 = substr($I1,0,$pos);
  109.     //判断类型
  110.     if(preg_match("/^(http|https|ftp):(//|\\)(([w/\+-~`@:%])+.)+([w/\.=?+-~`@':!%#]|(&)|&)+/i",$I1)){return $l1; }//http开头的url类型要跳过
  111.     elseif($I1[0]=="/"){$I1 = $l3.$I1;}//绝对路径
  112.     elseif(substr($I1,0,3)=="../"){//相对路径
  113.           while(substr($I1,0,3)=="../"){
  114.        $I1 = substr($I1,strlen($I1)-(strlen($I1)-3),strlen($I1)-3);
  115.        if(strlen($path)>0){
  116.         $path = dirname($path);
  117.        }
  118.       }
  119.       $I1 = $l3.$path."/".$I1;
  120.     }
  121.     elseif(substr($I1,0,2)=="./"){
  122.       $I1 = $l3.$path.substr($I1,strlen($I1)-(strlen($I1)-1),strlen($I1)-1);
  123.     }
  124.     elseif(strtolower(substr($I1,0,7))=="mailto:"||strtolower(substr($I1,0,11))=="java script:"){
  125.       return $l1;
  126.     }else{
  127.       $I1 = $l3.$path."/".$I1;
  128.     }
  129.     return str_replace($I2,"\"$I1\"",$l1);
  130.     }
  131. }
  132. ?>
复制代码
调用方法:
  1. <?php
  2. require_once(dirname(__FILE__).'/snap.class.php');
  3. $h = new snap();
  4. $h->fetch($_GET['url']);
  5. //echo $h->log;
  6. echo $h->contents;
  7. ?>
复制代码
先回复,再慢慢看!
















www.feng001.cn
返回列表