C# BBCode到HTML转换规则 背景
我使用C# BBCode到HTML转换规则 背景,c#,parsing,bbcode,specifications,C#,Parsing,Bbcode,Specifications,我使用C编写了非常简单的BBCode解析器,它将BBCode转换为HTML。目前它只支持[b]、[i]和[u]标记。我知道BBCode总是被认为是有效的,不管用户键入了什么。我找不到如何将BBCode转换为HTML的严格规范 问题: 是否存在标准的“BBCode到HTML”规范 我应该如何处理“[b][b][/b][/b]”?目前,解析器生成“[b][/b]” 我应该如何处理输入?目前,我的解析器足够聪明,可以为这种情况生成“zzz”输出,但我想知道它是“太聪明”的方法,还是不是 更多细节 我发
C
编写了非常简单的BBCode解析器,它将BBCode转换为HTML。目前它只支持[b]
、[i]
和[u]
标记。我知道BBCode总是被认为是有效的,不管用户键入了什么。我找不到如何将BBCode转换为HTML的严格规范
问题:
“[b][b][/b][/b]”
?目前,解析器生成“[b][/b]”
“zzz”
输出,但我想知道它是“太聪明”的方法,还是不是“[b][i]zzz[/b][/i]”
被转换为“zzz”
(注意关闭标记顺序)。FireBug当然会将其显示为“zzz”
。据我所知,浏览器会修复此类错误的结束标记,但我对此表示怀疑:
“[b][i]zzz[/b]ccc[/i]”
必须理解为“[i]zzzccc[/i]”
-逻辑上寻找这种不正确的格式,但与流行论坛BBCode输出冲突(*zzz****ccc*,而不是**[i]zzzccc[/i])谢谢。关于你的第一个问题,我不认为依靠浏览器来纠正任何类型的错误是一个好主意,不管你的项目范围是什么(好吧,也许除了你在浏览器本身上进行bug测试)。一些浏览器可能在这方面做得很棒,而另一些浏览器可能会失败得很惨。确保输出语法正确(或至少尽可能正确)的最佳方法是首先将带有正确语法的输出发送到浏览器
关于第二个问题,由于您正在尝试将正确的BBCode转换为正确的HTML,如果您的输入是
[b][i]zzz[/b]ccc[/i]
,那么它正确的HTML等价物将是zzzccc
,而不是[i]zzzccc[/i]
。这就是事情变得复杂的地方,因为你不再只是写一个转换器,而是一个语法检查/纠正器。我已经用PHP为一种相当奇怪的游戏引擎脚本语言编写了一个类似的脚本,但是逻辑可以很容易地应用到您的案例中。基本上,我为每个开始标记设置了一个标志,并检查结束标记是否位于正确的位置。当然,这提供了有限的功能,但对于我所需要的,它做到了。如果您需要更高级的搜索模式,我认为您必须使用正则表达式。如果您只打算实现B、I和U,它们不是非常重要的标记,为什么不为每个标记设置一个计数器,每次打开时+1,每次关闭时-1
在论坛帖子(或其他)的末尾,如果仍然有打开的标签,只需关闭它们。如果用户输入了无效的bbcode,那么在文章的持续时间内可能会显得很奇怪,但这不会是灾难性的。关于无效用户提交的标记,您至少有三种选择:
对于我自己的项目,我使用解析表达式语法(PEG)。我建议使用类似的方法。通常,这些类型的工具称为“编译器编译器”、“编译器生成器”或“解析器生成器”。使用其中一种可能是最明智的方法,因为它允许您以干净、可读的格式指定BBCode的语法。与使用正则表达式或尝试构建自己的状态机相比,使用这种方法会产生更少的bug。为什么有效的XHTML是项目的真正需求?不仅编程更加困难,而且似乎违反了最小意外原则。换句话说,用户希望格式不正确的BBCode以相同的格式不正确的HTML呈现。
XHTML
不是严格的要求,而是“它会很好”的特性。我正在使用HTML敏捷包来清理外部HTML输入。它不会生成真正的XHTML(不会关闭
标记),但它至少正确地处理zzz
并返回zzz
。是的,也许有些用户(尤其是黑客)希望看到邮件格式的HTML。但普通用户希望看到其输入的预期结果。他希望[b][i]zzz[/b][i]
将显示为zzz;在那里生成有效的HTML有什么实现细节可以保护我们不受浏览器细节的影响。但是为什么[b]z
必须呈现为z
?我认为自动尝试猜测用户想在哪里使用BBCode标记,以及他只想在哪里输入[b]z
“原样”不是一个好主意。总的来说,我想知道是否有一些标准的BBCode到HTML转换规则,或者每个人都以他认为有效的方式实现它??谢谢你的回答。但我仍然想知道是否存在“BBCode到HTML”规范(转换BBCode->HTML的标准化规则)?非常欢迎。尽可能