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 相关文章推荐
php分页示例代码
Mar 19 PHP
dedecms系统常用术语汇总
Apr 03 PHP
mysql 中InnoDB和MyISAM的区别分析小结
Apr 15 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
Feb 04 PHP
php的ajax简单实例
Feb 27 PHP
PHP中比较时间大小实例
Aug 21 PHP
php中adodbzip类实例
Dec 08 PHP
浅谈PHP值mysql操作类
Jun 29 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
php基于自定义函数记录log日志方法
Jul 21 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
基于Laravel-admin 后台的自定义页面用法详解
Sep 30 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
使用PHP 5.0创建图形的巧妙方法
2010/10/12 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
php简单浏览目录内容的实现代码
2013/06/07 PHP
php漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PHP等比例压缩图片的实例代码
2018/07/26 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
javascript排序函数实现数字排序
2015/06/26 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
2016/08/01 Javascript
微信小程序 slider的简单实例
2017/04/19 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
numpy.delete删除一列或多列的方法
2018/04/03 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
python是否适合网页编程详解
2019/10/04 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
村党支部书记承诺书
2014/05/29 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
绵山导游词
2015/02/05 职场文书
家电创业计划书
2019/08/05 职场文书
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python