|
|
|
| 一个可扩展的高速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] |
|
|
|