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 相关文章推荐
ftp类(example.php)
Oct 09 PHP
php简单封装了一些常用JS操作
Feb 25 PHP
轻松修复Discuz!数据库
May 03 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
Apr 09 PHP
解析用PHP实现var_export的详细介绍
Jun 20 PHP
PHPThumb图片处理实例
May 03 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 PHP
yii2.0实现验证用户名与邮箱功能
Dec 22 PHP
Laravel学习教程之路由模块
Aug 18 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Jan 22 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
picChange 图片切换特效的函数代码
2010/05/06 Javascript
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
vue router demo详解
2017/10/13 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
如何基于jQuery实现五角星评分
2020/09/02 jQuery
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python 连连看连接算法
2008/11/22 Python
python操作redis的方法
2015/07/07 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
python 多进程队列数据处理详解
2019/12/23 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
Pygame框架实现飞机大战
2020/08/07 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
香港个人化生活购物网站:Ballyhoo Limited
2016/09/10 全球购物
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
毕业生自荐信的主要内容
2013/10/29 职场文书
带薪年假请假条
2014/02/04 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
2019年教师入党申请书
2019/06/27 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python