设为首页收藏本站

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1075|回复: 1

远程图片本地化、解析UBB代码

[复制链接]
发表于 2011-8-5 00:10:40 | 显示全部楼层 |阅读模式
为了大家灌水方便,特修改几个文件,达到自动将网页内的html代码解析为UBB代码,同时将远程图片保存在论坛所在服务器。加快访问速度。

本人在discuz 4.0版本下调试测试用过

首先修改模板文件

./templates/default/post_newthread.htm找到
  1. <textarea rows="18" name="message" style="width: 80%; word-break: break-all" tabindex="4" onSelect="javascript: storeCaret(this);" onClick="javascript: storeCaret(this);" onKeyUp="javascript: storeCaret(this);" onKeyDown="ctlent(event);" >$message</textarea>
复制代码

修改为
  1. <textarea rows="18" name="message" style="width: 80%; word-break: break-all" tabindex="4" onSelect="javascript: storeCaret(this);" onClick="javascript: storeCaret(this);" onKeyUp="javascript: storeCaret(this);" onKeyDown="ctlent(event);" onbeforepaste="if(document.getElementById('x_paste').checked){window.clipboardData.setData('textID',trans());this.focus();}" id="textID">$message</textarea>

  2. <BR>
  3. <br>
  4. <INPUT  onclick="document.getElementById('textID').value += trans_java()" type=button value="转换为ubb代码">  <INPUT  onclick="document.getElementById('textID').value =''" type=button value="清除数据">
  5. <IFRAME id=rtf style="WIDTH: 0px; HEIGHT: 0px" marginWidth=0
  6.             marginHeight=0 src="about:blank" scrolling=no></IFRAME><LABEL
  7.             for=x_paste></LABEL>

  8. <SCRIPT>
  9. rtf.document.designMode="On";
  10. </SCRIPT>
复制代码



./templates/default/post_newreply.htm

中的
  1. <textarea rows="18" name="message" style="width: 80%; word-break: break-all" tabindex="4" onSelect="javascript: storeCaret(this);" onClick="javascript: storeCaret(this);" onKeyUp="javascript: storeCaret(this);" onKeyDown="ctlent(event);" >$message</textarea>
复制代码

修改为
  1. <textarea rows="18" name="message" style="width: 80%; word-break: break-all" tabindex="4" onSelect="javascript: storeCaret(this);" onClick="javascript: storeCaret(this);" onKeyUp="javascript: storeCaret(this);" onKeyDown="ctlent(event);" onbeforepaste="if(document.getElementById('x_paste').checked){window.clipboardData.setData('textID',trans());this.focus();}" id="textID">$message</textarea>
  2. <BR>
  3. <br>
  4. <INPUT  onclick="document.getElementById('textID').value += trans_java()" type=button value="转换为ubb代码">  <INPUT  onclick="document.getElementById('textID').value =''" type=button value="清除数据">
  5. <IFRAME id=rtf style="WIDTH: 0px; HEIGHT: 0px" marginWidth=0
  6.             marginHeight=0 src="about:blank" scrolling=no></IFRAME><LABEL
  7.             for=x_paste></LABEL>

  8. <SCRIPT>
  9. rtf.document.designMode="On";
  10. </SCRIPT>
复制代码

然后修改./include/common.js

在最后添加
  1. //------------------------------------------------------------------------------------
  2. function SymError()
  3. {
  4.   return true;
  5. }
  6. window.onerror = SymError;

  7. function trans_java() {
  8.         var str = "";
  9.         rtf.focus();
  10.         rtf.document.body.innerHTML = "";
  11.         rtf.document.execCommand("paste");
  12.         str = rtf.document.body.innerHTML;
  13.         if(str.length == 0) {
  14.                 alert("剪贴板不存在超文本数据!");
  15.                 return "";
  16.         }
  17.         str = str.replace(/\r/g,"");
  18.         str = str.replace("  ","");

  19.         
  20.         str = str.replace(/on(load|click|dbclick|mouseover|mousedown|mouseup)="[^"]+"/ig,"");
  21.         str = str.replace(/<script[^>]*?>([\w\W]*?)<\/script>/ig,"");

  22.         str = str.replace(/<a[^>]+href="([^"]+)"[^>]*>(.*?)<\/a>/ig,"[url=$1]$2[/url]");
  23.         str = str.replace(/<font[^>]+color=([^ >]+)[^>]*>(.*?)<\/font>/ig,"[color=$1]$2[/color]");
  24.         
  25.         str = str.replace(/<img[^>]+src="([^"]+)"[^>]*>/ig,"[img]$1[/img]\n\n");
  26.         
  27.         str = str.replace(/<([\/]?)b>/ig,"[$1b]");
  28.         str = str.replace(/<([\/]?)strong>/ig,"[$1b]");
  29.         str = str.replace(/<([\/]?)u>/ig,"[$1u]");
  30.         str = str.replace(/<([\/]?)i>/ig,"[$1i]");
  31.         
  32.         str = str.replace(/ /g," ");
  33.         str = str.replace(/&/g,"&");
  34.         str = str.replace(/"/g,""");
  35.         str = str.replace(/</g,"<");
  36.         str = str.replace(/>/g,">");
  37.         
  38.         str = str.replace(/<br>/ig,"\n");
  39.         str = str.replace(/<[^>]*?>/g,"");
  40.         str = str.replace(/\[url=([^\]]+)\]\n(\[img\]\1\[\/img\])\n\[\/url\]/g,"$2");
  41.         str = str.replace(/\n+/g,"\n");

  42.         str = str.replace(/QUOTE:/ig,"");
  43.         str = str.replace("","");

  44.         return str;
  45. }
  46. //------------------------------------------------------------------------------------------------
复制代码

到这里就可以实现剪贴板 ubb代码的转换,为了能使远程图片保存到本地服务器,还需要做如下修改,修改前请先备份相关文件。

打开 ./include/newthread.inc.php

找到
  1. $db->query("INSERT INTO {$tablepre}threads (fid, readperm, price, iconid, typeid, author, authorid, subject, dateline, lastpost, lastposter, displayorder, digest, blog, poll, attachment, moderated)
  2.                 VALUES ('$fid', '$readperm', '$price', '$iconid', '$typeid', '$discuz_user', '$discuz_uid', '$subject', '$timestamp', '$timestamp', '$discuz_user', '$displayorder', '$digest', '$blog', '$poll', '$attachment', '$moderated')");
复制代码

在其上面添加如下代码
  1. //获取$message中的远程图片
  2. $content = $message;
  3. $saveremoteimg = 1;
  4. $imgPath = './attachments' ;
  5. if(!empty($saveremoteimg))        {
  6.         $body = stripslashes($content);
  7.         $img_array = array();
  8.         preg_match_all("/(\[img\]|\[IMG\])(http:\/\/(.*)\.(gif|jpg|jpeg|bmp|png))(\[\/img\]|\[\/IMG\])/isU",$body,$img_array);
  9.         $img_array = array_unique($img_array[2]);
  10.         set_time_limit(0);
  11.         //$imgUrl = $img_dir."/".strftime("%Y%m%d",time());
  12.         //$imgPath = $base_dir.$imgUrl;
  13.         $milliSecond = strftime("%Y%m%d",time()).strftime("%H%M%S",time());
  14.         //if(!is_dir($imgPath)) @mkdir($imgPath,0777);
  15.         foreach($img_array as $key =>$value){
  16.                 $value = trim($value);
  17.                 $get_file = @file_get_contents($value);
  18.                 $rndFileName = $imgPath."/".$milliSecond.$key.".".substr($value,-3,3);
  19.                 $fileurl = $boardurl.'attachments/'.$milliSecond.$key.".".substr($value,-3,3);
  20.                 if($get_file)                        {
  21.                         $fp = @fopen($rndFileName,"w");
  22.                         @fwrite($fp,$get_file);
  23.                         @fclose($fp);
  24.                 }
  25.                 $body = ereg_replace($value,$fileurl,$body);
  26.         }
  27.         $content = addslashes($body);
  28. }
  29. $message = $content;
  30. //--------------------------------------------------
复制代码

修改./include/newreply.inc.php

找到
  1. $pinvisible = $modnewreplies ? 2 : 0;
复制代码

在其上面添加
  1. //获取文章body中的远程图片
  2. $content = $message;
  3. $saveremoteimg = 1;
  4. $imgPath = './attachments' ;
  5. if(!empty($saveremoteimg))        {
  6.         $body = stripslashes($content);
  7.         $img_array = array();
  8.         preg_match_all("/(\[img\]|\[IMG\])(http:\/\/(.*)\.(gif|jpg|jpeg|bmp|png))(\[\/img\]|\[\/IMG\])/isU",$body,$img_array);
  9.         $img_array = array_unique($img_array[2]);
  10.         set_time_limit(0);
  11.         $milliSecond = strftime("%Y%m%d",time()).strftime("%H%M%S",time());
  12.         foreach($img_array as $key =>$value){
  13.                 $value = trim($value);
  14.                 $get_file = @file_get_contents($value);
  15.                 $rndFileName = $imgPath."/".$milliSecond.$key.".".substr($value,-3,3);
  16.                 $fileurl = $boardurl.'attachments/'.$milliSecond.$key.".".substr($value,-3,3);
  17.                 if($get_file)                        {
  18.                         $fp = @fopen($rndFileName,"w");
  19.                         @fwrite($fp,$get_file);
  20.                         @fclose($fp);
  21.                 }
  22.                 $body = ereg_replace($value,$fileurl,$body);
  23.         }
  24.         $content = addslashes($body);
  25. }
  26. $message = $content;
  27. //--------------------------------------------------
复制代码

至此修改完毕
默认图片的保存路径在./attachments目录下,由于时间有限,没有将其做在后台,有兴趣的朋友可以修改,将其放到后台设置里面,使其更加灵活,适应性更高。

演示论坛请参考金山新人社区
(2006 帖子)

发表于 2011-10-29 17:49:46 | 显示全部楼层
继续支持没话说~ 楼主真强













发表于 2012-1-9 20:30:55
创意哦!楼主高人啊 谢












商标注册加急办理
支持 反对

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|BC Morning Website ( Best Deal Inc. 001 )  

GMT-8, 2025-12-12 11:10 , Processed in 0.018024 second(s), 16 queries .

Supported by Best Deal Online X3.5

© 2001-2025 Discuz! Team.

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