Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 274|回复: 0

[Java基础知识]高速UBB标签转换引擎

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 20:06:33 | 显示全部楼层 |阅读模式
    高速UBB标签转换引擎.
    /**
    * 版权所有 2006(C) 中国java手机网(www.cnjm.net)。所有版权保留。
    * 作者开放本代码的目的是希望更多人使用它,任何人只要遵从以下条款,就可以传播、使用或修改本代码:

    * 1. 再发布本代码必须完整保留此版权声明及条款,不得删除。

    * 2. 使用本代码开发的软件必须在版权信息中声明: “本软件在开发中使用了中国Java手机网(www.cnjm.net)编写的UBB转换引擎”。

    * 3. 使用本代码开发的软件应在文档中加入中国Java手机网(www.cnjm.net) 的链接。

    * 4. 使用者必须独自承担使用本代码的风险,中国Java手机网不为本代码对其软件或系统可能造成的任何损害承担责任。
    */      
                                           
    一个可扩展的高速UBB标签转换引擎 ( 中国JAVA手机网<www.cnjm.net>)

              现在UBB标签技术已经广泛的应用于网站开发中,比起直接使用HTML标签,UBB标签更安全,也更容易学习。

             目前各种服务器端技术,无论是CGI(perl), ASP, PHP还是JSP,在网上都能找到大量的UBB转换代码,但经过笔者的考察,大部分都是采用正则表达式匹配替换的方式实现的,用这种方式比较简单易行,但是有一些明显的缺点:

    1. 性能较差,因为这种转换方法对每一种UBB标签都要做一次全文的匹配替换,所以UBB标签种类越多,速度越慢;

    2. 对错误的嵌套方式会做出错误的转换处理,比如"",会被转换为"<b>你<i>好</b>啊</i>",这显然是错误的HTML语法,因为HTML的标签只能互相嵌套,而是不允许互相跨越的;

    3. 不支持同类标签的嵌套使用,比如"",会被转换为"<font color=red>你好</font>啊";

    4. 扩展起来较为困难,因为需要扩展者也要有正则表达式的知识才能正确的添加新的UBB标签,而相对来说,正则表达式的理解和学习还是有一定难度的。

           针对这种现状,笔者在开发UBB标签转换系统时使用了全新的思路和算法,即把整个文章转换成一棵由UBB标签和正文组成的树,针对每个UBB标签的树节点进行转换处理,采用这种全新算法的UBB标签转换器有以下的特点:

    1. 性能极高,对全文只扫描一遍,且和UBB标签的种类数量无关,因此可以任意添加新的UBB标签而不必担心性能会下降;

    2. 容错性非常好,对于上面的错误UBB语法"",可以选择两种容错模式“忽略(IGNORE)”和“关闭(CLOSE)”,如果采用忽略模式,那么错误的标签会被忽略掉,也就是转换为"<b>你好</b>啊";而如果采用关闭模式,则内层的未关闭UBB标签会被自动关闭,即转换成为"<b>你<i>好</i></b>啊"。无论哪种模式,产生的HTML代码都是正确的;

    3. 支持同类标签的多次嵌套;

    4. 支持“空”标签,也就是形如[img=myimg.gif/]这样用"/]"结尾,且没有对应结束标签的UBB代码;

    5. 容易扩展,用户只要自定义一个UBB标签处理器,负责可能的UBB标签的鉴别工作,和最后如何对标签的属性和内嵌文本进行处理就可以了。

          所谓“可能的UBB标签”,就是任何一对"["和"]"中间的内容,自定义标签处理器要负责判断这段内容是否是合法的UBB标签,并把标签分成UBB标记和标记的属性两部分,比如,引擎调用处理器的方法handler.parseTag("color=red", false),处理器应把参数分成UBB标记"color"和属性"red"两部分并作为字符串数组返回,而对于非UBB标签,比如"[转贴文章]",处理器只要简单的返回null,转换引擎就会把它作为普通文本处理。

          而最后的处理工作也很简单,转换引擎会调用处理器的compose方法,把UBB标记,标记的属性和内嵌的文本传给该方法,比如handler.compose("color", "red", "你好啊", false),处理器只要简单的把它们组合成"<font color=red>你好啊</font>"并返回这个字符串就可以了。

          本站(中国JAVA手机网<www.cnjm.net>)的文章系统与文章评论就是使用了这套UBB处理引擎,你可以在发表评论的时候测试一下本站的UBB代码支持。 作为一个例子,下面就是一个简单的UBB标签处理器,是本站使用的UBB标签处理器的一个简化版本:
            这个简单的例子支持的标签种类不多,你可以继续扩展,另外用一大堆equals挨个进行比较效率比较低,你可以用一个HashMap或Hashtable来进行快速的定位和查找。

    =============================== SimpleTagHandler.java源代码 ===============================
    package util;

    public class SimpleTagHandler implements UBBTagHandler {
            
    //    文字加粗体效果
    //    文字加倾斜效果
    //    文字加下划线效果
    //    改变文字大小
    //    改变文字颜色
    //   
    这个标签是用来做为引用所设置的,如果你有什么内容是引用自别的地方,请加上这个标签!

    //    http://www.cnjm.net/resfetch/JiG ... F9f....4ZxyD9bhcols[/url]
    //    [url=http://www.cnjm.net/resfetch/JiGbbGz0UF9f....4ZxyD9bhcols]JAVA手机网[/url]
    //    写信给我
    //    webmaster@cnjm.net
    //       
       
      public SimpleTagHandler() { }

        public String[] parseTag(String s, boolean isEmpty) {
            if (isEmpty) { // 本处理器不支持空标签
                return null;
            }
            // 如果标签中有"="号就把标签分为UBB标记和属性两部分,否则属性为null
            String tag = s, attr = null;
            int idx = s.indexOf("=");
            if (idx >= 0) {
                tag = s.substring(0, idx);
                attr = s.substring(idx + 1);
            }
            String tmp = tag.toLowerCase(); // 大小写不敏感
            // 只有下面的标记是本处理器支持的
            if ("b".equals(tmp) ||
                "i".equals(tmp) ||
                "u".equals(tmp) ||
                "size".equals(tmp) ||
                "color".equals(tmp) ||
                "quote".equals(tmp) ||
                "url".equals(tmp) ||
                "email".equals(tmp) ||
                "img".equals(tmp)) {
                return new String[] { tag, attr };
            }
            // 不是一个合法的UBB标签,作为普通文本处理
            return null;
        }

        public String compose(String tag, String attr, String data, boolean isEmpty) {
            // 针对不同标记进行组合工作
            String tmp = tag;
            if ("b".equals(tmp) ||
                "i".equals(tmp) ||
                "u".equals(tmp)) {
                return "<" + tag + ">" + data + "</" + tag + ">";
            } else if ("size".equals(tmp) ||
                "color".equals(tmp)) {
                return "<font " + tag + "="" + attr + "">" + data + "</font>";
            } else if ("quote".equals(tmp)) {
                return "<table cellpadding=0 cellspacing=0 width=94% bgcolor=#000000 align=center style="table-layout:fixed"><tr><td><table width=100% cellpadding=5 cellspacing=1 style="table-layout:fixed"><tr><td bgcolor=#FFFFFF style="left: 0px; width: 100%; word-wrap: break-word">"
                        + data + "</td></tr></table></td></tr></table>";
            } else if ("url".equals(tmp)) {
                String url = attr != null ? attr : data;
                return "<a href="" + url + "" target=_blank>" + data + "</a>";
            } else if ("email".equals(tmp)) {
                String email = attr != null ? attr : data;
                return "<a href="mailto:" + email + "">" + data + "</a>";
            } else if ("img".equals(tmp)) {
                return "<img src="" + data + "" border=0>";
            }
            return data;
        }
       
        // 测试代码,可以运行这个类,并把包含UBB标签的文本作为参数传入来测试
        // 比如java util.SimpleTagHandler ""
        public static void main(String[] args) throws Exception {
            System.out.println(">>>>" + args[0]);
            // 下面采用了忽略模式来容错,你也可以用MODE_CLOSE试验一下关闭模式的容错效果
            System.out.println("=========================
    "
                    + UBBDecoder.decode(args[0], new SimpleTagHandler(), UBBDecoder.MODE_IGNORE));
       }

    }

    运行结果: C:java>java util.SimpleTagHandler
    >>>>
    =========================
    <font color="red">你<font color="blue">好</font>啊</font>
          
         
         
      


    源码下载:http://file.javaxxz.com/2014/10/1/200633500.zip
    回复

    使用道具 举报

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

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-22 18:58 , Processed in 0.407532 second(s), 50 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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