Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BBCode到HTML转换规则 背景_C#_Parsing_Bbcode_Specifications - Fatal编程技术网

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的严格规范

问题:
  • 是否存在标准的“BBCode到HTML”规范
  • 我应该如何处理
    “[b][b][/b][/b]”
    ?目前,解析器生成
    “[b][/b]”
  • 我应该如何处理输入?目前,我的解析器足够聪明,可以为这种情况生成
    “zzz”
    输出,但我想知道它是“太聪明”的方法,还是不是
  • 更多细节 我发现了一些现成的BBCode解析器实现,但它们对我来说太重/复杂了,更糟糕的是,它们使用了大量正则表达式,并没有产生我所期望的标记。理想情况下,我希望在输出端接收XHTML。为了推断“BBCode到HTML”转换规则,我使用了以下在线解析器:。它生成的HTML在我看来是直观正确的。我唯一不喜欢它的是它不产生XHTML。例如,
    “[b][i]zzz[/b][/i]”
    被转换为
    “zzz”
    (注意关闭标记顺序)。FireBug当然会将其显示为
    “zzz”
    。据我所知,浏览器会修复此类错误的结束标记,但我对此表示怀疑:

  • 我是否应该依赖浏览器的这个特性,而不要尝试使用XHTML
  • 也许
    “[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,那么在文章的持续时间内可能会显得很奇怪,但这不会是灾难性的。

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

  • 去掉它
  • 逐字打印,即不要将其转换为HTML
  • 尝试修复它
  • 我不推荐3。很快就会变得很棘手。1和2都是合理的选择

    至于如何解析BBCode,我强烈建议不要使用regex。BBCode实际上是一种相当复杂的语言。最重要的是,它支持标签嵌套。正则表达式不能处理任意嵌套。这是正则表达式的基本限制之一。这使得它成为解析HTML和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的标准化规则)?非常欢迎。尽可能