我使用C#
编写了非常简单的BBCode解析器,它将BBCode转换为HTML。目前,它仅支持[b]
,[i]
和[u]
标记。我知道无论用户输入什么,BBCode始终被认为是有效的。我找不到严格的规范如何将BBCode转换为HTML
"[b][b][/b][/b]"
?现在解析器产生"<b>[b][/b]</b>"
。"[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>"
。据我了解,浏览器修复了错误的结束标签订单案例,但我有疑问:
"[b][i]zzz[/b]ccc[/i]"
必须被理解为"<b>[i]zzz</b>ccc[/i]"
- 从逻辑上看这种不正确的格式,但与流行论坛的BBCode输出相冲突( * zzz **** ccc *,而不是* * [I] zzzccc [/ I] )感谢。
答案 0 :(得分:2)
关于你的第一个问题,我不认为依赖浏览器纠正任何类错误是一个好主意,无论你的项目范围如何(好吧,也许除非你实际上在浏览器上进行bug测试)。有些浏览器可能会做一个很棒的工作,而其他浏览器可能会失败。确保输出语法正确(或至少尽可能正确)的最佳方法是首先使用正确的语法将其发送到浏览器。
关于您的第二个问题,由于您尝试将正确的BBCode转换为正确的HTML,如果您的输入为[b][i]zzz[/b]ccc[/i]
,则其正确的 HTML等效项将为<i><b>zzz</b>ccc</i>
而不是<b>[i]zzz</b>ccc[/i]
。这就是事情变得复杂的地方,因为你不再只是编写转换器了,而且还有语法检查器/纠正器。我在PHP中编写了一个类似的脚本,用于一种相当奇怪的游戏引擎脚本语言,但逻辑可以很容易地应用到你的案例中。基本上,我为每个开始标记设置了一个标记,并检查结束标记是否在正确的位置。当然,这提供了有限的功能,但对于我需要的它,它做了伎俩。如果你需要更高级的搜索模式,我认为你坚持使用正则表达式。
答案 1 :(得分:0)
如果你只是要实现B,I和U,它们不是非常重要的标签,为什么不简单地为每个标签设置一个计数器:每次打开时为+1,每次为-1它关闭了。
在论坛帖子(或其他)的末尾,如果还有打开的标签,只需关闭它们即可。如果用户输入无效的bbcode,它们的帖子持续时间可能会很奇怪,但这不会是灾难性的。
答案 2 :(得分:0)
关于无效的用户提交的标记,您至少有三个选项:
我不推荐3.它变得非常棘手。 1和2都是合理的选择。
至于如何解析BBCode,我强烈建议不要使用正则表达式。 BBCode实际上是一种相当复杂的语言。最重要的是,它支持标记的嵌套。正则表达式无法处理任意嵌套。这是正则表达式的基本限制之一。这使得它成为解析HTML和BBCode等语言的糟糕选择。
对于我自己的项目rbbcode,我使用解析表达式语法(PEG)。我建议使用类似的东西。通常,这些类型的工具称为“编译器编译器”,“编译器生成器”或“解析器生成器”。使用其中一个可能是最安全的方法,因为它允许您以干净,可读的格式指定BBCode的语法。与使用正则表达式或尝试构建自己的状态机相比,这种方式的错误更少。