Discuz教程网

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

[复制链接]
authicon dly 发表于 2011-9-3 19:35:52 | 显示全部楼层 |阅读模式
第一步. 先从文章中把所有<img ...> 用正则 抠出来.
代码如下:


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

  8. 第二步. 把$img_array 数组循环一下. 做图片保存和文章位置替换

  9. 代码如下:

  10. foreach ($img_array as $img){
  11. //判断是否是自己网站上的 图片
  12. if('xxx.com' != get_domain($img)){// 如果这个图片不是自己服务器上的
  13. //读取图片文件
  14. $Gimg = new GetImage();
  15. $Gimg->source = $img;
  16. $Gimg->save_to = './data/temp/';
  17. $FILE = $Gimg->download(); //图片移动到本地
  18. //保存到相册 得到图片保存的位置
  19. $img_path = pic_save($FILE,0,'');
  20. //文本路径替换
  21. $message = str_replace($img, $img_path, $message);
  22. }
  23. }

  24. ....这时候 $message 里面已经图片已经替换为自己服务器本地的地址,并且图片也保存到自己的服务器上.

  25. 代码如下:

  26. //下面一个函数 和 类是从网络上找的.
  27. //从url中获得域名
  28. function get_domain($url){
  29. $pattern = "/[\w-]+\.(com|net|org|gov|cc|biz|info|cn)(\.(cn|hk))*/";
  30. preg_match($pattern, $url, $matches);
  31. if(count($matches) > 0) {
  32. return $matches[0];
  33. }else{
  34. $rs = parse_url($url);
  35. $main_url = $rs["host"];
  36. if(!strcmp(long2ip(sprintf("%u",ip2long($main_url))),$main_url)) {
  37. return $main_url;
  38. }else{
  39. $arr = explode(".",$main_url);
  40. $count=count($arr);
  41. $endArr = array("com","net","org","3322");//com.cn net.cn 等情况
  42. if (in_array($arr[$count-2],$endArr)){
  43. $domain = $arr[$count-3].".".$arr[$count-2].".".$arr[$count-1];
  44. }else{
  45. $domain = $arr[$count-2].".".$arr[$count-1];
  46. }
  47. return $domain;
  48. }// end if(!strcmp...)
  49. }// end if(count...)
  50. }// end function
  51. // 从远程吧图片载到服务器本地 的 类
  52. class GetImage {
  53. var $source;
  54. var $save_to;
  55. var $quality;
  56. function download($method = 'curl') {
  57. $info = @GetImageSize($this->source);
  58. $mime = $info['mime'];
  59. // What sort of image?
  60. $type = substr(strrchr($mime, '/'), 1);
  61. switch ($type){
  62. case 'jpeg':
  63. $image_create_func = 'ImageCreateFromJPEG';
  64. $image_save_func = 'ImageJPEG';
  65. $new_image_ext = 'jpg';
  66. // Best Quality: 100
  67. $quality = isSet($this->quality) ? $this->quality : 100;
  68. break;
  69. case 'png':
  70. $image_create_func = 'ImageCreateFromPNG';
  71. $image_save_func = 'ImagePNG';
  72. $new_image_ext = 'png';
  73. // Compression Level: from 0 (no compression) to 9
  74. $quality = isSet($this->quality) ? $this->quality : 0;
  75. break;
  76. case 'bmp':
  77. $image_create_func = 'ImageCreateFromBMP';
  78. $image_save_func = 'ImageBMP';
  79. $new_image_ext = 'bmp';
  80. break;
  81. case 'gif':
  82. $image_create_func = 'ImageCreateFromGIF';
  83. $image_save_func = 'ImageGIF';
  84. $new_image_ext = 'gif';
  85. break;
  86. case 'vnd.wap.wbmp':
  87. $image_create_func = 'ImageCreateFromWBMP';
  88. $image_save_func = 'ImageWBMP';
  89. $new_image_ext = 'bmp';
  90. break;
  91. case 'xbm':
  92. $image_create_func = 'ImageCreateFromXBM';
  93. $image_save_func = 'ImageXBM';
  94. $new_image_ext = 'xbm';
  95. break;
  96. default:
  97. $image_create_func = 'ImageCreateFromJPEG';
  98. $image_save_func = 'ImageJPEG';
  99. $new_image_ext = 'jpg';
  100. }
  101. if(isSet($this->set_extension)){
  102. $ext = strrchr($this->source, ".");
  103. $strlen = strlen($ext);
  104. $new_name = basename(substr($this->source, 0, -$strlen)).'.'.$new_image_ext;
  105. }else{
  106. $new_name = basename($this->source);
  107. }
  108. $save_to = $this->save_to."/blog_insert_temp_".time().mt_rand(1,99).".".$new_image_ext;
  109. //输出对象 组成跟$_FILE变量一样 得到后自己和平常图片上传处理一样了
  110. $img_info['name'] = basename($this->source);
  111. $img_info['type'] = $mime;
  112. $img_info['size'] = 1000;
  113. $img_info['tmp_name'] = $save_to;
  114. $img_info['error'] = 0;
  115. if($method == 'curl'){
  116. $save_image = $this->LoadImageCURL($save_to);
  117. }elseif($method == 'gd'){
  118. $img = $image_create_func($this->source);
  119. if(isSet($quality)){
  120. $save_image = $image_save_func($img, $save_to, $quality);
  121. }else{
  122. $save_image = $image_save_func($img, $save_to);
  123. }
  124. }
  125. return $img_info;
  126. }
  127. function LoadImageCURL($save_to){
  128. $ch = curl_init($this->source);
  129. $fp = fopen($save_to, "wb");
  130. // set URL and other appropriate options
  131. $options = array(CURLOPT_FILE => $fp,
  132. CURLOPT_HEADER => 0,
  133. CURLOPT_FOLLOWLOCATION => 1,
  134. CURLOPT_TIMEOUT => 60); // 1 minute timeout (should be enough)
  135. curl_setopt_array($ch, $options);
  136. curl_exec($ch);
  137. curl_close($ch);
  138. fclose($fp);
  139. }
  140. }
复制代码







上一篇:PHP 翻页 实例代码
下一篇:UTF8编码内的繁简转换的PHP类
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 17:08

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表