0

背景

我编写了非常简单的 BBCode 解析器,使用C#它将 BBCode 转换为 HTML。目前它只支持[b],[i][u]标签。我知道无论用户输入什么,BBCode 总是被认为是有效的。我找不到如何将 BBCode 转换为 HTML 的严格规范

问题

  1. 是否存在标准的“BBCode to HTML”规范?
  2. 我应该如何处理"[b][b][/b][/b]"?现在解析器产生"<b>[b][/b]</b>".
  3. 我应该如何处理"[b][i][u]zzz[/b][/i][/u]"输入?目前我的解析器足够聪明,可以"<b><i><u>zzz</u></i></b>"为这种情况产生输出,但我想知道这是“太聪明”的方法,还是不是?

更多细节

我找到了一些现成的 BBCode 解析器实现,但它们对我来说太重/太复杂了,更糟糕的是,使用了大量的正则表达式并且产生的标记不是我所期望的。理想情况下,我想在输出端接收 XHTML。为了推断“BBCode 到 HTML”转换规则,我使用了这个在线解析器:http ://www.bbcode.org/playground.php 。它生成的 HTML 在我看来是直观正确的。我唯一不喜欢它的就是不生成 XHTML。例如"[b][i]zzz[/b][/i]"转换为"<b><i>zzz</b></i>"(注意结束标签顺序)。FireBug 当然将其显示为"<b><i>zzz</i></b><i></i>". 据我了解,浏览器会修复此类错误的结束标签订单情况,但我对此表示怀疑:

  1. 我是否应该依赖此浏览器功能而不尝试制作 XHTML。
  2. 也许"[b][i]zzz[/b]ccc[/i]"必须被理解为"<b>[i]zzz</b>ccc[/i]"- 从逻辑上看这种不正确的格式,但与流行论坛的 BBCode 输出相冲突(*zzz****ccc*,而不是 **[i]zzzccc[/i]

谢谢。

4

3 回答 3

2

关于您的第一个问题,无论您的项目范围如何,我认为依靠浏览器来纠正任何类型的错误都不是一个好主意(好吧,也许除非您实际上对浏览器本身进行错误测试)。一些浏览器可能在这方面做得很棒,而另一些浏览器可能会惨遭失败。确保输出语法正确(或至少尽可能正确)的最佳方法是首先将其以正确的语法发送到浏览器。

关于您的第二个问题,由于您试图将正确的 BBCode 转换为正确的 HTML,如果您的输入是[b][i]zzz[/b]ccc[/i],那么其正确的HTML 等效项将是<i><b>zzz</b>ccc</i>而不是<b>[i]zzz</b>ccc[/i]。这就是事情变得复杂的地方,因为您不再只是编写转换器,而且还要编写语法检查器/纠正器。我在 PHP 中为一种相当奇怪的游戏引擎脚本语言编写了一个类似的脚本,但该逻辑可以很容易地应用于您的案例。基本上,我为每个开始标签设置了一个标志,并检查结束标签是否在正确的位置。当然,这提供了有限的功能,但是对于我需要的东西,它可以解决问题。如果您需要更高级的搜索模式,我认为您会遇到正则表达式。

于 2009-12-13T22:38:01.067 回答
0

如果您只打算实现 B、I 和 U,它们不是非常重要的标签,为什么不简单地为每个标签设置一个计数器:每次打开时 +1,每次关闭时 -1。

在论坛帖子(或其他任何内容)的末尾,如果仍有打开的标签,只需将它们关闭即可。如果用户输入了无效的 bbcode,在他们发帖期间可能看起来很奇怪,但不会是灾难性的。

于 2009-12-14T03:19:30.220 回答
0

关于无效的用户提交的标记,您至少有三个选项:

  1. 剥掉它
  2. 逐字打印,即不要将其转换为 HTML
  3. 尝试修复它。

我不推荐 3。它真的很快变得非常棘手。1和2都是合理的选择。

至于如何解析BBCode,我强烈建议不要使用正则表达式。BBCode 实际上是一种相当复杂的语言。最重要的是,它支持标签的嵌套。正则表达式无法处理任意嵌套。这是正则表达式的基本限制之一。这使得它成为解析 HTML 和 BBCode 等语言的糟糕选择。

对于我自己的项目rbbcode,我使用了解析表达式语法(PEG)。我建议使用类似的东西。通常,这些类型的工具被称为“编译器编译器”、“编译器生成器”或“解析器生成器”。使用其中一种可能是最明智的方法,因为它允许您以干净、可读的格式指定 BBCode 的语法。与使用正则表达式或尝试构建自己的状态机相比,这种方式的错误更少。

于 2013-08-15T19:50:05.350 回答