PHP 文章中的远程图片采集到本地的代码


Posted in PHP onJuly 30, 2009

第一步. 先从文章中把所有<img ...> 用正则 抠出来.

$message //文章内容 
//正则(这个还不是) 
$reg = "/<img[^>]*src=\"(http:\/\/(.+)\/(.+)\.(jpg|gif|bmp|bnp))\"/isU"; 
//把抠出来的 img 地址存放到 $img_array 变量中 
preg_match_all($reg, $message, $img_array, PREG_PATTERN_ORDER); 
//过滤重复的图片 
$img_array = array_unique($img_array[1]);

第二步. 把$img_array 数组循环一下. 做图片保存和文章位置替换
foreach ($img_array as $img){ 
//判断是否是自己网站上的 图片 
if('xxx.com' != get_domain($img)){// 如果这个图片不是自己服务器上的 
//读取图片文件 
$Gimg = new GetImage(); 
$Gimg->source = $img; 
$Gimg->save_to = './data/temp/'; 
$FILE = $Gimg->download(); //图片移动到本地 
//保存到相册 得到图片保存的位置 
$img_path = pic_save($FILE,0,''); 
//文本路径替换 
$message = str_replace($img, $img_path, $message); 
} 
}

....这时候 $message 里面已经图片已经替换为自己服务器本地的地址,并且图片也保存到自己的服务器上.
//下面一个函数 和 类是从网络上找的. 
//从url中获得域名 
function get_domain($url){ 
$pattern = "/[\w-]+\.(com|net|org|gov|cc|biz|info|cn)(\.(cn|hk))*/"; 
preg_match($pattern, $url, $matches); 
if(count($matches) > 0) { 
return $matches[0]; 
}else{ 
$rs = parse_url($url); 
$main_url = $rs["host"]; 
if(!strcmp(long2ip(sprintf("%u",ip2long($main_url))),$main_url)) { 
return $main_url; 
}else{ 
$arr = explode(".",$main_url); 
$count=count($arr); 
$endArr = array("com","net","org","3322");//com.cn net.cn 等情况 
if (in_array($arr[$count-2],$endArr)){ 
$domain = $arr[$count-3].".".$arr[$count-2].".".$arr[$count-1]; 
}else{ 
$domain = $arr[$count-2].".".$arr[$count-1]; 
} 
return $domain; 
}// end if(!strcmp...) 
}// end if(count...) 
}// end function 
// 从远程吧图片载到服务器本地 的 类 
class GetImage { 
var $source; 
var $save_to; 
var $quality; 
function download($method = 'curl') { 
$info = @GetImageSize($this->source); 
$mime = $info['mime']; 
// What sort of image? 
$type = substr(strrchr($mime, '/'), 1); 
switch ($type){ 
case 'jpeg': 
$image_create_func = 'ImageCreateFromJPEG'; 
$image_save_func = 'ImageJPEG'; 
$new_image_ext = 'jpg'; 
// Best Quality: 100 
$quality = isSet($this->quality) ? $this->quality : 100; 
break; 
case 'png': 
$image_create_func = 'ImageCreateFromPNG'; 
$image_save_func = 'ImagePNG'; 
$new_image_ext = 'png'; 
// Compression Level: from 0 (no compression) to 9 
$quality = isSet($this->quality) ? $this->quality : 0; 
break; 
case 'bmp': 
$image_create_func = 'ImageCreateFromBMP'; 
$image_save_func = 'ImageBMP'; 
$new_image_ext = 'bmp'; 
break; 
case 'gif': 
$image_create_func = 'ImageCreateFromGIF'; 
$image_save_func = 'ImageGIF'; 
$new_image_ext = 'gif'; 
break; 
case 'vnd.wap.wbmp': 
$image_create_func = 'ImageCreateFromWBMP'; 
$image_save_func = 'ImageWBMP'; 
$new_image_ext = 'bmp'; 
break; 
case 'xbm': 
$image_create_func = 'ImageCreateFromXBM'; 
$image_save_func = 'ImageXBM'; 
$new_image_ext = 'xbm'; 
break; 
default: 
$image_create_func = 'ImageCreateFromJPEG'; 
$image_save_func = 'ImageJPEG'; 
$new_image_ext = 'jpg'; 
} 
if(isSet($this->set_extension)){ 
$ext = strrchr($this->source, "."); 
$strlen = strlen($ext); 
$new_name = basename(substr($this->source, 0, -$strlen)).'.'.$new_image_ext; 
}else{ 
$new_name = basename($this->source); 
} 
$save_to = $this->save_to."/blog_insert_temp_".time().mt_rand(1,99).".".$new_image_ext; 
//输出对象 组成跟$_FILE变量一样 得到后自己和平常图片上传处理一样了 
$img_info['name'] = basename($this->source); 
$img_info['type'] = $mime; 
$img_info['size'] = 1000; 
$img_info['tmp_name'] = $save_to; 
$img_info['error'] = 0; 
if($method == 'curl'){ 
$save_image = $this->LoadImageCURL($save_to); 
}elseif($method == 'gd'){ 
$img = $image_create_func($this->source); 
if(isSet($quality)){ 
$save_image = $image_save_func($img, $save_to, $quality); 
}else{ 
$save_image = $image_save_func($img, $save_to); 
} 
} 
return $img_info; 
} 
function LoadImageCURL($save_to){ 
$ch = curl_init($this->source); 
$fp = fopen($save_to, "wb"); 
// set URL and other appropriate options 
$options = array(CURLOPT_FILE => $fp, 
CURLOPT_HEADER => 0, 
CURLOPT_FOLLOWLOCATION => 1, 
CURLOPT_TIMEOUT => 60); // 1 minute timeout (should be enough) 
curl_setopt_array($ch, $options); 
curl_exec($ch); 
curl_close($ch); 
fclose($fp); 
} 
}
PHP 相关文章推荐
WINDOWS 2000下使用ISAPI方式安装PHP
Sep 05 PHP
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
php include,include_once,require,require_once
Sep 05 PHP
PHP 单引号与双引号的区别
Nov 24 PHP
php 记录进行累加并显示总时长为秒的结果
Nov 04 PHP
php5.3不能连接mssql数据库的解决方法
Dec 27 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
Phpstorm+Xdebug断点调试PHP的方法
May 14 PHP
php实现微信企业转账功能
Oct 02 PHP
JS操作XML中DTD介绍及使用方法分析
Jul 04 PHP
php实现对短信验证码发送次数的限制实例讲解
Mar 04 PHP
PHP 中文乱码解决办法总结分析
Jul 30 #PHP
PHP 变量定义和变量替换的方法
Jul 30 #PHP
PHP file_get_contents 函数超时的几种解决方法
Jul 30 #PHP
一个PHP数组应该有多大的分析
Jul 30 #PHP
PHP UTF8编码内的繁简转换类
Jul 20 #PHP
php 验证码制作(网树注释思想)
Jul 20 #PHP
php PDO中文乱码解决办法
Jul 20 #PHP
You might like
php5.2.0内存管理改进
2007/01/22 PHP
php中去除所有js,html,css代码
2010/10/12 PHP
php判断两个日期之间相差多少个月份的方法
2015/06/18 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
PHP asXML()函数讲解
2019/02/03 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
python进阶教程之模块(module)介绍
2014/08/30 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
Python定时任务sched模块用法示例
2018/07/16 Python
浅谈Django的缓存机制
2018/08/23 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
2020/04/22 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
python excel和yaml文件的读取封装
2021/01/12 Python
人才市场接收函
2015/01/30 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers