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 输出双引号&quot;与单引号'的方法
May 09 PHP
自己在做项目过程中学到的PHP知识收集
Aug 20 PHP
非常精妙的PHP递归调用与静态变量使用
Dec 16 PHP
php检测url是否存在的方法
Apr 14 PHP
CodeIgniter使用smtp服务发送html邮件的方法
Jun 10 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
CI映射(加载)数据到view层的方法
Mar 28 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
Dec 29 PHP
PHP中类的自动加载的方法
Mar 17 PHP
PHP生成推广海报的方法分享
Apr 22 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 PHP
laravel 使用auth编写登录的方法
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 str_replace替换指定次数的方法详解
2017/05/05 PHP
jQuery 常见学习网站与参考书
2009/11/09 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
2016/01/28 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python轻松实现代码编码格式转换
2015/03/26 Python
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
浅谈html5增强的页面元素
2016/06/14 HTML / CSS
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
什么是数据抽象
2016/11/26 面试题
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
传播学毕业生求职信
2013/10/11 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
运动会入场解说词300字
2014/01/25 职场文书
丽江古城导游词
2015/02/03 职场文书
小学元宵节活动总结
2015/02/06 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
2022/06/25 Servers