用户: 密码: 答案:   我要注册   忘记密码

加入收藏  设为首页

开发文档

CNJM首页

业界新闻

手机软件

终端应用

资源下载

EclipseME

CNJM论坛

                 

频道列表

J2ME开发 190篇
服务器端开发 34篇
JAVA语言 81篇
游戏与图形 102篇
WindowsMobile开发 6篇
Symbian开发 62篇
Brew开发 36篇
其它开发平台 9篇

热点文章

cookie和session机... 13909次
Eclipse 3.4 (Gany... 10811次
介绍一篇关于sessi... 10282次
[J2EE新手入门]使...  9869次
一个可扩展的高速U... 9672次
所有支持WAP手机上... 9095次
使用Java实现UBBCo... 9094次
JSP安全性初探 8820次
在Win2K+resin中配... 8715次
Apache下 配置WAP ... 8394次
J2EE应用性能问题...  7971次
JSP应用程序开发中... 7714次

文章搜索

搜 索
按 照
频 道
  
一个可扩展的高速UBB标签转换引擎
编辑:rocks    审核:rocks    文章来源:本站原创
关键词:ubb    发表日期:2006-03-23 15:15:26    浏览次数:9673次
本文版权归原作者,中国JAVA手机网收录本文的目的是让更多人阅读到此文章。转载请注明出处为中国JAVA手机网<www.cnjm.net>

[本文章最后由 rocks 在2006-03-23 15:21:43编辑过]

来自:http://www.cnjm.net/tech/article1263.html

下载源代码

现在UBB标签技术已经广泛的应用于网站开发中,比起直接使用Html标签,UBB标签更安全,也更容易学习。
目前各种服务器端技术,无论是CGI(perl), ASP, PHP还是JSP,在网上都能找到大量的UBB转换代码,但经过笔者的考察,大部分都是采用正则表达式匹配替换的方式实现的,用这种方式比较简单易行,但是有一些明显的缺点:
1. 性能较差,因为这种转换方法对每一种UBB标签都要做一次全文的匹配替换,所以UBB标签种类越多,速度越慢
2. 对错误的嵌套方式会做出错误的转换处理,比如"[b]你[i]好[/b]啊[/i]",会被转换为"<b>你<i>好</b>啊</i>",这显然是错误的HTML语法,因为HTML的标签只能互相嵌套,而是不允许互相跨越的
3. 不支持同类标签的嵌套使用,比如"[color=red]你[color=blue]好[/color]啊[/color]",会被转换为"<font color=red>你[color=blue]好</font>啊[/color]"
4. 扩展起来较为困难,因为需要扩展者也要有正则表达式的知识才能正确的添加新的UBB标签,而相对来说,正则表达式的理解和学习还是有一定难度的
针对这种现状,笔者在开发本站的UBB标签转换系统时使用了全新的思路和算法,即把整个文章转换成一棵由UBB标签和正文组成的树,针对每个UBB标签的树节点进行转换处理,采用这种全新算法的UBB标签转换器有以下的特点:
1. 性能极高,对全文只扫描一遍,且和UBB标签的种类数量无关,因此可以任意添加新的UBB标签而不必担心性能会下降
2. 容错性非常好,对于上面的错误UBB语法"[b]你[i]好[/b]啊[/i]",可以选择两种容错模式“忽略(IGNORE)”和“关闭(CLOSE)”,如果采用忽略模式,那么错误的标签会被忽略掉,也就是转换为"<b>你[i]好</b>啊[/i]";而如果采用关闭模式,则内层的未关闭UBB标签会被自动关闭,即转换成为"<b>你<i>好</i></b>啊[/i]"。无论哪种模式,产生的HTML代码都是正确的
3. 支持同类标签的多次嵌套
JAVA手机网[www.cnjm.net]
4. 支持“空”标签,也就是形如[img=myimg.gif/]这样用"/]"结尾,且没有对应结束标签的UBB代码
5. 容易扩展,用户只要自定义一个UBB标签处理器,负责可能的UBB标签的鉴别工作,和最后如何对标签的属性和内嵌文本进行处理就可以了。
JAVA手机网[www.cnjm.net]
所谓“可能的UBB标签”,就是任何一对"["和"]"中间的内容,自定义标签处理器要负责判断这段内容是否是合法的UBB标签,并把标签分成UBB标记和标记的属性两部分,比如,引擎调用处理器的方法handler.parseTag("color=red", false),处理器应把参数分成UBB标记"color"和属性"red"两部分并作为字符串数组返回,而对于非UBB标签,比如"[转贴文章]",处理器只要简单的返回null,转换引擎就会把它作为普通文本处理。
而最后的处理工作也很简单,转换引擎会调用处理器的compose方法,把UBB标记,标记的属性和内嵌的文本传给该方法,比如handler.compose("color", "red", "你好啊", false),处理器只要简单的把它们组合成"<font color=red>你好啊</font>"并返回这个字符串就可以了。
本站的文章系统与文章评论就是使用了这套UBB处理引擎,你可以在发表评论的时候测试一下本站的UBB代码支持。
作为一个例子,下面就是一个简单的UBB标签处理器,是本站使用的UBB标签处理器的一个简化版本:
这个简单的例子支持的标签种类不多,你可以继续扩展,另外用一大堆equals挨个进行比较效率比较低,你可以用一个HashMap或Hashtable来进行快速的定位和查找。

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

public class SimpleTagHandler implements UBBTagHandler {
       
//    [b]文字加粗体效果[/b]
//    [i]文字加倾斜效果[/i]
//    [u]文字加下划线效果[/u]
//    [size=4]改变文字大小[/size]
//    [color=red]改变文字颜色[/color]
//    [quote]这个标签是用来做为引用所设置的,如果你有什么内容是引用自别的地方,请加上这个标签![/quote]  
//    [url]http://www.cnjm.net[/url]
//    [url=http://www.cnjm.net]JAVA手机网[/url]
//    [email=webmaster@cnjm.net]写信给我[/email]
//    [email]webmaster@cnjm.net[/email]
//    [img]mainlogo.gif[/img]    
   
   public SimpleTagHandler() { }

   public String[] parseTag(String s, boolean isEmpty) {
       if (isEmpty) { // 本处理器不支持空标签
           return null;
       }
       // 如果标签中有'='号就把标签分为UBB标记和属性两部分,否则属性为null
JAVA手机网[www.cnjm.net]
       String tag = s, attr = null;
       int idx = s.indexOf('=');
       if (idx >= 0) {
JAVA手机网[www.cnjm.net]
           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) ||
JAVA手机网[www.cnjm.net]
           "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 "[color=red]你[color=blue]好[/color]啊[/color]"
   public static void main(String[] args) throws Exception {
       System.out.println(">>>>" + args[0]);
       // 下面采用了忽略模式来容错,你也可以用MODE_CLOSE试验一下关闭模式的容错效果
       System.out.println("=========================\n"
               + UBBDecoder.decode(args[0], new SimpleTagHandler(), UBBDecoder.MODE_IGNORE));
   }

}

下载源代码
来自:http://www.cnjm.net/tech/article1263.html

相关文章
    使用Java实现UBBCode的转换  [2006-03-03]
最新评论   [查看全部评论(16条)]
bra_jlm 在 2008-10-22 19:30:48 发表的评论:
hahahaha 
bra_jlm 在 2008-10-22 19:29:46 发表的评论:
lala 
gl521 在 2008-04-16 21:39:41 发表的评论:
sdfsdfsdfdsf 
chinarlzn 在 2007-11-13 10:06:58 发表的评论:
不错 
aquaflakes 在 2007-08-09 14:47:48 发表的评论:
tttttttt 
aquaflakes 在 2007-08-09 14:47:30 发表的评论:
color=red]tttttttt[/color] 
网站简介  |  关于版权  |  广告服务  |  网站地图  |  联系我们
Copyright © www.CNJM.net, All rights reserved
中国JAVA手机网 版权所有 京ICP备041452
本站带宽由互联互通提供