Java BBCode库

16

有没有人使用过一个好的Java BBCode实现? 我正在查看:

  1. javabbcode :没什么可看的
  2. kefir-bb :标记为Alpha版本
  3. JBoss源代码中的BBCode解析器。

是否有更好的选择?


你找到了任何BBCode解析器/库吗? - Kdeveloper
1
我尝试了KefirBB,它非常易于使用,当前的0.6版本也没有标记为beta。 - Kdeveloper
4个回答

17

KefirBB 0.6已不再被列为beta版。我发现KefirBB解析器非常容易配置和扩展,可以使用自己的标签:

kefir-bb.sourceforge.net

(这是我迄今为止找到的最好的BBCode解析器)

我还在fyhao.com上发现了这段代码,但它不能保护你免受不正确的嵌套标签(因此不适合解析用户输入):

    public static String bbcode(String text) {
        String html = text;

        Map<String,String> bbMap = new HashMap<String , String>();

        bbMap.put("(\r\n|\r|\n|\n\r)", "<br/>");
        bbMap.put("\\[b\\](.+?)\\[/b\\]", "<strong>$1</strong>");
        bbMap.put("\\[i\\](.+?)\\[/i\\]", "<span style='font-style:italic;'>$1</span>");
        bbMap.put("\\[u\\](.+?)\\[/u\\]", "<span style='text-decoration:underline;'>$1</span>");
        bbMap.put("\\[h1\\](.+?)\\[/h1\\]", "<h1>$1</h1>");
        bbMap.put("\\[h2\\](.+?)\\[/h2\\]", "<h2>$1</h2>");
        bbMap.put("\\[h3\\](.+?)\\[/h3\\]", "<h3>$1</h3>");
        bbMap.put("\\[h4\\](.+?)\\[/h4\\]", "<h4>$1</h4>");
        bbMap.put("\\[h5\\](.+?)\\[/h5\\]", "<h5>$1</h5>");
        bbMap.put("\\[h6\\](.+?)\\[/h6\\]", "<h6>$1</h6>");
        bbMap.put("\\[quote\\](.+?)\\[/quote\\]", "<blockquote>$1</blockquote>");
        bbMap.put("\\[p\\](.+?)\\[/p\\]", "<p>$1</p>");
        bbMap.put("\\[p=(.+?),(.+?)\\](.+?)\\[/p\\]", "<p style='text-indent:$1px;line-height:$2%;'>$3</p>");
        bbMap.put("\\[center\\](.+?)\\[/center\\]", "<div align='center'>$1");
        bbMap.put("\\[align=(.+?)\\](.+?)\\[/align\\]", "<div align='$1'>$2");
        bbMap.put("\\[color=(.+?)\\](.+?)\\[/color\\]", "<span style='color:$1;'>$2</span>");
        bbMap.put("\\[size=(.+?)\\](.+?)\\[/size\\]", "<span style='font-size:$1;'>$2</span>");
        bbMap.put("\\[img\\](.+?)\\[/img\\]", "<img src='$1' />");
        bbMap.put("\\[img=(.+?),(.+?)\\](.+?)\\[/img\\]", "<img width='$1' height='$2' src='$3' />");
        bbMap.put("\\[email\\](.+?)\\[/email\\]", "<a href='mailto:$1'>$1</a>");
        bbMap.put("\\[email=(.+?)\\](.+?)\\[/email\\]", "<a href='mailto:$1'>$2</a>");
        bbMap.put("\\[url\\](.+?)\\[/url\\]", "<a href='$1'>$1</a>");
        bbMap.put("\\[url=(.+?)\\](.+?)\\[/url\\]", "<a href='$1'>$2</a>");
        bbMap.put("\\[youtube\\](.+?)\\[/youtube\\]", "<object width='640' height='380'><param name='movie' value='http://www.youtube.com/v/$1'></param><embed src='http://www.youtube.com/v/$1' type='application/x-shockwave-flash' width='640' height='380'></embed></object>");
        bbMap.put("\\[video\\](.+?)\\[/video\\]", "<video src='$1' />");

        for (Map.Entry entry: bbMap.entrySet()) {
            html = html.replaceAll(entry.getKey().toString(), entry.getValue().toString());
        }

        return html;
    }

顺便提一下,javaBBcode是一个开源项目的一部分:JavaBB


2
看起来 KefirBB 已经被移动到 GitHub https://github.com/kefirfromperm/kefirbb 并且正在积极开发中。 - Kuitsi
1
你的意思是“它不能保护你”吗? - Tristan

3

我认为更好的选择是使用维基标记语言。

除非您有非技术用户习惯于bbcode,而且对学习另一种奇怪的标记语言不是很感兴趣。

我以前成功地使用正则表达式在html和bbcode之间进行转换。定义一个涵盖每个标签的表达式列表,并为每个表达式预编译模式。然后迭代地使用每个表达式来转换字符串。可以双向转换。性能实际上相当不错,而且您可以轻松适应自己的方言/扩展。

缺点是正则表达式并不总是容易理解。


3
另一个将BBCode解析和转换为HTML的Java选项是Prime Transformer。
我们为某些特定用途构建了它,但尝试使其足够通用以供一般使用。我在GitHub的主页上提供了如何组合它的基本示例。 https://github.com/inversoft/prime-transformer

1
不确定为什么这个回复会被踩,因为那个库是开源的,并且处理非常复杂的BBCode。 - voidmain
@voidmain 不是我给你点了踩,但可能是因为它不起作用。解析器似乎很好,但转换器在实例化时崩溃了。它试图使用FreeMarker,但由于没有java.beans.introspector而崩溃。因此,它的实用性似乎受到限制。 - Agent_L
@Agent_L 这可能是由于您使用的Java版本和在运行时包含的Java模块。您可能还使用了 jlink 来创建自定义JDK,而您自定义JDK中的模块缺少Java beans包。 - voidmain
@voidmain 显然,在Android上无法使用豆子工具。实现基本的HTML“转换器”很容易,但非常繁琐。 - Agent_L
重要的是要记住,Android虚拟机(Dalvik,现在是ART)与Java虚拟机不同。仅因为这个库是用Java编写的,并不意味着它与Android兼容。这个库的某个分支适用于Android系统。如果我找到了,我会发布它。 - robotdan
这个Android库包含了一个修改版的prime-transformer。你可以使用它,提取代码,或者直接fork prime-transformer来在Android中使用。https://github.com/Ndersam/amebo。请查看`amebo/core/src/main/java/com/amebo/core/`。 - robotdan

3
我认为更好的选择是使用维基标记语言。你可以尝试使用Mylyn Wikitext包,我目前在我们的文档系统中使用这个包非常成功。
然而,如果你尝试自动解析一些论坛文本,这并不是解决你问题的答案。

Wiki标记语言是一个好主意。我的目的是在我所工作的应用程序中标准化文本格式化机制。现在我们允许用户输入任何内容,然后通过白名单标签进行所有的清理。对我来说,只允许BBCode / Wiki标记似乎是一个更好的主意。 - Rohit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接