科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件让你的JSP支持Ubbcode

让你的JSP支持Ubbcode

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

让你的JSP支持Ubbcode。

作者:baggio785 来源:CSDN 2008年3月27日

关键字: Ubbcode 支持 JSP 开源

  • 评论
  • 分享微博
  • 分享邮件

  1. import java.util.regex.*;//导入正则表达式包中的类
  2. /**
  3.  *  使网页支持ubbcode.
  4.  * @author shanwei
  5.  * @version 1.0
  6.  */
  7. public final class Ubbcode {
  8.     private static final String ImagePath = "images/"//定义图片路径
  9.     private static final String emotImagePath = "images/emot/";
  10.     /**
  11.      * @description 转换代码,使之支持ubbcode.
  12.      * @param strContent 转换前的代码.
  13.      * @return result 转换后的内容.
  14.      */
  15.     public static String UBBCode(String strContent) { //
  16.         strContent = dvHTMLEncode(strContent);
  17.         strContent = FilterJS(strContent);
  18.         String re;
  19.         //re.IgnoreCase =true
  20.         //re.Global=True
  21.         Pattern pattern = null//
  22.         Matcher matcher = null;
  23.         //转换IMG
  24.         re = "\\[IMG\\](http|https|ftp):\\/\\/(.[^\\[]*)\\[\\/IMG\\]";
  25.         pattern = Pattern.compile(re);
  26.         matcher = pattern.matcher(strContent);
  27.         strContent = matcher.replaceAll("<a onfocus=this.blur() href=\"$1://$2\" target=_blank><IMG SRC=\"$1://$2\" border=0 alt=按此在新窗口浏览图片 onload=\"javascript:if(this.width>screen.width-333)this.width=screen.width-333\"></a>");
  28.         //转换UPLOAD
  29.         re = "\\[UPLOAD=(gif|jpg|jpeg|bmp|png)\\](.[^\\[]*)(gif|jpg|jpeg|bmp|png)\\[\\/UPLOAD\\]";
  30.         pattern = Pattern.compile(re);
  31.         matcher = pattern.matcher(strContent);
  32.         strContent = matcher.replaceAll("<br><IMG SRC=\"" + ImagePath + "$1.gif\" border=0>此主题相关图片如下:<br><A HREF=\"$2$1\" TARGET=_blank><IMG SRC=\"$2$1\" border=0 alt=按此在新窗口浏览图片 onload=\"javascript:if(this.width>screen.width-333)this.width=screen.width-333\"></A>");
  33.         re = "\\[UPLOAD=(.[^\\[]*)\\](.[^\\[]*)\\[\\/UPLOAD\\]";
  34.         pattern = Pattern.compile(re);
  35.         matcher = pattern.matcher(strContent);
  36.         strContent = matcher.replaceAll("<br><IMG SRC=\"" + ImagePath +
  37.                                         "$1.gif\" border=0> <a href=\"$2\">点击浏览该文件</a>");
  38.         //转换DIR
  39.         re = "\\[DIR=*([0-9]*),*([0-9]*)\\](.[^\\[]*)\\[\\/DIR]";
  40.         pattern = Pattern.compile(re);
  41.         matcher = pattern.matcher(strContent);
  42.         strContent = matcher.replaceAll("<object classid=clsid:166B1BCA-3F9C-11CF-8075-444553540000 codebase=http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=7,0,2,0 width=$1 height=$2><param name=src value=$3><embed src=$3 pluginspage=http://www.macromedia.com/shockwave/download/ width=$1 height=$2></embed></object>");
  43.         //转换QT
  44.         re = "\\[QT=*([0-9]*),*([0-9]*)\\](.[^\\[]*)\\[\\/QT]";
  45.         pattern = Pattern.compile(re);
  46.         matcher = pattern.matcher(strContent);
  47.         strContent = matcher.replaceAll("<embed src=$3 width=$1 height=$2 autoplay=true loop=false controller=true playeveryframe=false cache=false scale=TOFIT bgcolor=#000000 kioskmode=false targetcache=false pluginspage=http://www.apple.com/quicktime/>;");
  48.         //转换MP
  49.         re = "\\[MP=*([0-9]*),*([0-9]*)\\](.[^\\[]*)\\[\\/MP]";
  50.         pattern = Pattern.compile(re);
  51.         matcher = pattern.matcher(strContent);
  52.         strContent = matcher.replaceAll("<object align=middle classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95 class=OBJECT id=MediaPlayer width=$1 height=$2 ><param name=ShowStatusBar value=-1><param name=Filename value=$3><embed type=application/x-oleobject codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701 flename=mp src=$3  width=$1 height=$2></embed></object>");
  53.         //转换RM
  54.         re = "\\[RM=*([0-9]*),*([0-9]*)\\](.[^\\[]*)\\[\\/RM]";
  55.         pattern = Pattern.compile(re);
  56.         matcher = pattern.matcher(strContent);
  57.         strContent = matcher.replaceAll("<OBJECT classid=clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA class=OBJECT id=RAOCX width=$1 height=$2><PARAM NAME=SRC VALUE=$3><PARAM NAME=CONSOLE VALUE=Clip1><PARAM NAME=CONTROLS VALUE=imagewindow><PARAM NAME=AUTOSTART VALUE=true></OBJECT><br><OBJECT classid=CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA height=32 id=video2 width=$1><PARAM NAME=SRC VALUE=$3><PARAM NAME=AUTOSTART VALUE=-1><PARAM NAME=CONTROLS VALUE=controlpanel><PARAM NAME=CONSOLE VALUE=Clip1></OBJECT>");
  58.         //转换FLASH
  59.         re = "(\\[FLASH\\])(.[^\\[]*)(\\[\\/FLASH\\])";
  60.         pattern = Pattern.compile(re);
  61.         matcher = pattern.matcher(strContent);
  62.         strContent = matcher.replaceAll(
  63.                 "<a href=\"$2\" TARGET=_blank><IMG SRC=\"" + ImagePath + "swf.gif\" border=0 alt=点击开新窗口欣赏该FLASH动画! height=16 width=16>[全屏欣赏]</a><br><OBJECT codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=500 height=400><PARAM NAME=movie VALUE=\"$2\"><PARAM NAME=quality VALUE=high><embed src=\"$2\" quality=high pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' width=500 height=400>$2</embed></OBJECT>");
  64.         re = "(\\[FLASH=*([0-9]*),*([0-9]*)\\])(.[^\\[]*)(\\[\\/FLASH\\])";
  65.         pattern = Pattern.compile(re);
  66.         matcher = pattern.matcher(strContent);
  67.         strContent = matcher.replaceAll(
  68.                 "<a href=\"$4\" TARGET=_blank><IMG SRC=\"" + ImagePath + "swf.gif\" border=0 alt=点击开新窗口欣赏该FLASH动画! height=16 width=16>[全屏欣赏]</a><br><OBJECT codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=$2 height=$3><PARAM NAME=movie VALUE=\"$4\"><PARAM NAME=quality VALUE=high><embed src=\"$4\" quality=high pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' width=$2 height=$3>$4</embed></OBJECT>");
  69.         //转换URL
  70.         re = "(\\[URL\\])(.[^\\[]*)(\\[\\/URL\\])";
  71.         pattern = Pattern.compile(re);
  72.         matcher = pattern.matcher(strContent);
  73.         strContent = matcher.replaceAll("<A HREF=\"$2\" TARGET=_blank>$2</A>");
  74.         re = "(\\[URL=(.[^\\[]*)\\])(.[^\\[]*)(\\[\\/URL\\])";
  75.         pattern = Pattern.compile(re);
  76.         matcher = pattern.matcher(strContent);
  77.         strContent = matcher.replaceAll("<A HREF=\"$2\" TARGET=_blank>$3</A>");
  78.         //转换EMAIL
  79.         re = "(\\[EMAIL\\])(\\S+\\@.[^\\[]*)(\\[\\/EMAIL\\])";
  80.         pattern = Pattern.compile(re);
  81.         matcher = pattern.matcher(strContent);
  82.         strContent = matcher.replaceAll("<img align=absmiddle src=\"" +
  83.                                         ImagePath +
  84.                                         "email1.gif\"><A HREF=\"mailto:$2\">$2</A>");
  85.         re = "(\\[EMAIL=(\\S+\\@.[^\\[]*)\\])(.[^\\[]*)(\\[\\/EMAIL\\])";
  86.         pattern = Pattern.compile(re);
  87.         matcher = pattern.matcher(strContent);
  88.         strContent = matcher.replaceAll("<img align=absmiddle src=\"" +
  89.                                         ImagePath +
  90.                                         "email1.gif\"><A HREF=\"mailto:$2\" TARGET=_blank>$3</A>");
  91.         //自动识别网址
  92.         re =
  93.                 "^((http|https|ftp|rtsp|mms):(\\/\\/|\\\\)[A-Za-z0-9\\./=\\?%\\-&_~`@':+!]+)";
  94.         pattern = Pattern.compile(re);
  95.         matcher = pattern.matcher(strContent);
  96.         strContent = matcher.replaceAll(
  97.                 "<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=$1>$1</a>");
  98.         re =
  99.                 "((http|https|ftp|rtsp|mms):(\\/\\/|\\\\)[A-Za-z0-9\\./=\\?%\\-&_~`@':+!]+)$";
  100.         pattern = Pattern.compile(re);
  101.         matcher = pattern.matcher(strContent);
  102.         strContent = matcher.replaceAll(
  103.                 "<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=$1>$1</a>");
  104.         re = "([^>=\"])((http|https|ftp|rtsp|mms):(\\/\\/|\\\\)[A-Za-z0-9\\./=\\?%\\-&_~`@':+!]+)";
  105.         pattern = Pattern.compile(re);
  106.         matcher = pattern.matcher(strContent);
  107.         strContent = matcher.replaceAll("$1<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=$2>$2</a>");
  108.         //自动识别www等开头的网址
  109.         re = "([^(http://|http:\\\\)])((www|cn)[.](\\w)+[.]{1,}(net|com|cn|org|cc)(((\\/[\\~]*|\\[\\~]*)(\\w)+)|[.](\\w)+)*(((([?](\\w)+){1}[=]*))*((\\w)+){1}([\\&](\\w)+[\\=](\\w)+)*)*)";
  110.         pattern = Pattern.compile(re);
  111.         matcher = pattern.matcher(strContent);
  112.         strContent = matcher.replaceAll("<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=http://$2>$2</a>");
  113.         //自动识别Email地址,如打开本功能在浏览内容很多的帖子会引起服务器停顿
  114.         re = "([^(=)])((\\w)+[@]{1}((\\w)+[.]){1,3}(\\w)+)";
  115.         pattern = Pattern.compile(re);
  116.         matcher = pattern.matcher(strContent);
  117.         strContent = matcher.replaceAll("<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=\"mailto:$2\">$2</a>");
  118.         //转换EM
  119.         re = "\\[em(.[^\\[]*)\\]";
  120.         pattern = Pattern.compile(re);
  121.         matcher = pattern.matcher(strContent);
  122.         strContent = matcher.replaceAll("<img src=\"" + emotImagePath +
  123.                                         "em$1.gif\" border=0 align=middle>");
  124.         //转换HTML
  125.         re = "\\[HTML\\](.[^\\[]*)\\[\\/HTML\\]";
  126.         pattern = Pattern.compile(re);
  127.         matcher = pattern.matcher(strContent);
  128.         strContent = matcher.replaceAll("<table width='100%' border='0' cellspacing='0' cellpadding='6' class=tableborder1><td><b>以下内容为程序代码:</b><br>$1</td></table>");
  129.         //转换CODE
  130.         re = "\\[code\\](.[^\\[]*)\\[\\/code\\]";
  131.         pattern = Pattern.compile(re);
  132.         matcher = pattern.matcher(strContent);
  133.         strContent = matcher.replaceAll("<table width='100%' border='0' cellspacing='0' cellpadding='6' class=tableborder1><td><b>以下内容为程序代码:</b><br>$1</td></table>");
  134.         //转换COLOR
  135.         re = "\\[color=(.[^\\[]*)\\](.[^\\[]*)\\[\\/color\\]";
  136.         pattern = Pattern.compile(re);
  137.         matcher = pattern.matcher(strContent);
  138.         strContent = matcher.replaceAll("<font color=$1>$2</font>");
  139.         //转换FACE
  140.         re = "\\[face=(.[^\\[]*)\\](.[^\\[]*)\\[\\/face\\]";
  141.         pattern = Pattern.compile(re);
  142.         matcher = pattern.matcher(strContent);
  143.         strContent = matcher.replaceAll("<font face=$1>$2</font>");
  144.         //转换ALIGN
  145.         re = "\\[align=(center|left|right)\\](.*)\\[\\/align\\]";
  146.         pattern = Pattern.compile(re);
  147.         matcher = pattern.matcher(strContent);
  148.         strContent = matcher.replaceAll("<div align=$1>$2</div>");
  149.         //转换QUOTE
  150.         re = "\\[QUOTE\\](.*)\\[\\/QUOTE\\]";
  151.         pattern = Pattern.compile(re);
  152.         matcher = pattern.matcher(strContent);
  153.         strContent = matcher.replaceAll("<table style=\"width:80%\" cellpadding=5 cellspacing=1 class=tableborder1><TR><TD class=tableborder1>$1</td></tr></table><br>");
  154.         //转换FLY
  155.         re = "\\[fly\\](.*)\\[\\/fly\\]";
  156.         pattern = Pattern.compile(re);
  157.         matcher = pattern.matcher(strContent);
  158.         strContent = matcher.replaceAll(
  159.                 "<marquee width=90% behavior=alternate scrollamount=3>$1</marquee>");
  160.         //转换MOVE
  161.         re = "\\[move\\](.*)\\[\\/move\\]";
  162.         pattern = Pattern.compile(re);
  163.         matcher = pattern.matcher(strContent);
  164.         strContent = matcher.replaceAll("<MARQUEE scrollamount=3>$1</marquee>");
  165.         //转换GLOW
  166.         re =
  167.                 "\\[GLOW=*([0-9]*),*(#*[a-z0-9]*),*([0-9]*)\\](.[^\\[]*)\\[\\/GLOW]";
  168.         pattern = Pattern.compile(re);
  169.         matcher = pattern.matcher(strContent);
  170.         strContent = matcher.replaceAll(
  171.                 "<table width=$1 style=\"filter:glow(color=$2, strength=$3)\">$4</table>");
  172.         //转换SHADOW
  173.         re =
  174.                 "\\[SHADOW=*([0-9]*),*(#*[a-z0-9]*),*([0-9]*)\\](.[^\\[]*)\\[\\/SHADOW]";
  175.         pattern = Pattern.compile(re);
  176.         matcher = pattern.matcher(strContent);
  177.         strContent = matcher.replaceAll(
  178.                 "<table width=$1 style=\"filter:shadow(color=$2, strength=$3)\">$4</table>");
  179.         re = "\\[i\\](.[^\\[]*)\\[\\/i\\]";
  180.         pattern = Pattern.compile(re);
  181.         matcher = pattern.matcher(strContent);
  182.         strContent = matcher.replaceAll("<i>$1</i>");
  183.         re = "\\[u\\](.[^\\[]*)(\\[\\/u\\])";
  184.         pattern = Pattern.compile(re);
  185.         matcher = pattern.matcher(strContent);
  186.         strContent = matcher.replaceAll("<u>$1</u>");
  187.         re = "\\[b\\](.[^\\[]*)(\\[\\/b\\])";
  188.         pattern = Pattern.compile(re);
  189.         matcher = pattern.matcher(strContent);
  190.         strContent = matcher.replaceAll("<b>$1</b>");
  191.         re = "\\[size=([1-4])\\](.[^\\[]*)\\[\\/size\\]";
  192.         pattern = Pattern.compile(re);
  193.         matcher = pattern.matcher(strContent);
  194.         strContent = matcher.replaceAll("<font size=$1>$2</font>");
  195.         /*re ="(\\s)";
  196.                  matcher = pattern.matcher(strContent);  
  197.                  strContent=matcher.replaceAll("<I>$1</I>");*/
  198.         re = null;
  199.         return strContent;
  200.     }
  201. /**
  202.  *  过滤javascript代码.
  203.  * @param v转换前的代码.
  204.  * @return v转换后的内容.
  205.  */
  206.     public static String FilterJS(String v) {
  207.         if (!v.equals("null") && v != null) {
  208.             String t, re;
  209.             re = "(javascript)";
  210.             t = re.replace(v, "javascript");
  211.             re = "(jscript:)";
  212.             t = re.replace(t, "jscript:");
  213.             re = "(js:)";
  214.             t = re.replace(t, "js:");
  215.             re = "(value)";
  216.             t = re.replace(t, "value");
  217.             re = "(about:)";
  218.             t = re.replace(t, "about:");
  219.             re = "(file:)";
  220.             t = re.replace(t, "file:");
  221.             re = "(document.cookie)";
  222.             t = re.replace(t, "documents.cookie");
  223.             re = "(vbscript:)";
  224.             t = re.replace(t, "vbscript:");
  225.             re = "(vbs:)";
  226.             t = re.replace(t, "vbs:");
  227.             re = "(on(mouse|exit|error|click|key))";
  228.             t = re.replace(t, "on$2");
  229.             re = "(&#)";
  230.             t = re.replace(t, "&#");
  231.             re = null;
  232.         }
  233.         return v;
  234.     }
  235. /**
  236.  *  替换一些特殊符号为html语法标记.
  237.  * @param fString转换前的代码.
  238.  * @return fString转换后的内容.
  239.  */ 
  240.   public static String dvHTMLEncode(String fString) {
  241.         if (!fString.equals("null") && fString != null) {
  242.             fString = replace(fString, ">"">");
  243.             fString = replace(fString, "<""<");
  244.             fString = replace(fString, "&""&");
  245.             fString = replace(fString, " "" ");
  246.             fString = replace(fString, "\""""");
  247.             fString = replace(fString, "\'""'");
  248.             fString = replace(fString, "\r""");
  249.             fString = replace(fString, "\n""<BR> ");
  250.             fString = replace(fString, "\\", "\");
  251.         }
  252.         return fString;
  253.     }
  254. /**
  255.  *  html语法标记转换符号本身.
  256.  * @param fString转换前的代码.
  257.  * @return fString转换后的内容.
  258.  */  
  259.   public static String dvHTMLCode(String fString) {
  260.         if (!fString.equals("null") && fString != null) {
  261.             fString = replace(fString, ">"">");
  262.             fString = replace(fString, "<""<");
  263.             fString = replace(fString, "&""&");
  264.             fString = replace(fString, " "" ");
  265.             fString = replace(fString, """"\"");
  266.             fString = replace(fString, "'""\'");
  267.             fString = replace(fString, "\""\\");
  268.             fString = replace(fString, "<BR>""\n");
  269.         }
  270.         return fString;
  271.     }
  272.     public static String nohtml(String str) {
  273.         String re;
  274.         Pattern pattern = null;
  275.         Matcher matcher = null;
  276.         re = "(\\<.[^\\<]*\\>)";
  277.         pattern = Pattern.compile(re);
  278.         matcher = pattern.matcher(str);
  279.         str = matcher.replaceAll(" ");
  280.         re = "(\\<\\/[^\\<]*\\>)";
  281.         str = re.replace(str, " ");
  282.         re = null;
  283.         return str;
  284.     }
  285. /**
  286.  *  分割函数.
  287.  * @param source原字符串,div将要被分割的字符串.
  288.  * @return returnStr分割后的字符串.
  289.  */  
  290.    public static String[] split(String source, String div) {
  291.         int arynum = 0, intIdx = 0, intIdex = 0, div_length = div.length();
  292.         if (source.compareTo("") != 0) {
  293.             if (source.indexOf(div) != -1) {
  294.                 intIdx = source.indexOf(div);
  295.                 for (int intCount = 1; ; intCount++) {
  296.                     if (source.indexOf(div, intIdx + div_length) != -1) {
  297.                         intIdx = source.indexOf(div, intIdx + div_length);
  298.                         arynum = intCount;
  299.                     } else {
  300.                         arynum += 2;
  301.                         break;
  302.                     }
  303.                 }
  304.             } else {
  305.                 arynum = 1;
  306.             }
  307.         } else {
  308.             arynum = 0;
  309.         }
  310.         intIdx = 0;
  311.         intIdex = 0;
  312.         String[] returnStr = new String[arynum];
  313.   if (source.compareTo("") != 0) {
  314.             if (source.indexOf(div) != -1) {
  315.                 intIdx = (int) source.indexOf(div);
  316.                 returnStr[0] = (String) source.substring(0, intIdx);
  317.                 for (int intCount = 1; ; intCount++) {
  318.                     if (source.indexOf(div, intIdx + div_length) != -1) {
  319.                         intIdex = (int) source.indexOf(div, intIdx + div_length);
  320.                         returnStr[intCount] = (String) source.substring(intIdx +
  321.                                 div_length,
  322.                                 intIdex);
  323.                         intIdx = (int) source.indexOf(div, intIdx + div_length);
  324.                     } else {
  325.                         returnStr[intCount] = (String) source.substring(intIdx +
  326.                                 div_length,
  327.                                 source.length());
  328.                         break;
  329.                     }
  330.                 }
  331.             } else {
  332.                 returnStr[0] = (String) source.substring(0, source.length());
  333.                 return returnStr;
  334.             }
  335.         } else {
  336.             return returnStr;
  337.         }
  338.         return returnStr;
  339.     }
  340. /**
  341.  *  替换函数.
  342.  * @param str替换前的字符串,substr被替换的字符,restr替换的字符.
  343.  * @return 替换后并且经过除空处理的字符串.
  344.  */  
  345.     public static String replace(String str, String substr, String restr) {
  346.         String[] tmp = split(str, substr);
  347.         String returnstr = null;
  348.         if (tmp.length != 0) {
  349.             returnstr = tmp[0];
  350.             for (int i = 0; i < tmp.length - 1; i++) {
  351.                 returnstr = dealNull(returnstr) + restr + tmp[i + 1];
  352.             }
  353.         }
  354.         return dealNull(returnstr);
  355.     }
  356. /**
  357.  *  除空处理函数.
  358.  * @param str原字符串.
  359.  * @return 处理后的字符串.
  360.  */  
  361.     public static String dealNull(String str) {
  362.         String returnstr = null;
  363.         if (str == null) {
  364.             returnstr = "";
  365.         } else {
  366.             returnstr = str;
  367.         }
  368.         return returnstr;
  369.     }
  370.     public static String tostring(Character i) {
  371.         Character c = i;
  372.         return c.toString();
  373.     }
  374. }

引自:http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=51550

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章