背景

我已经写了非常简单的设置高亮析器使用 C# 这将要设置高亮HTML。目前,它仅仅支持 [b], [i][u] 标记。我知道,设置高亮总是被认为是有效的,无论什么用户有类型。我找不到严格规范如何改变设置高亮HTML

的问题

  1. 不标准"设置高亮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>" 出于这样的情况,但我不知道,这是"太聪明"的方法,或者它是不是?

更多细节

我找到了一些准备使用的设置高亮析程序实现,但它们太沉重的/复杂的对我来说,更糟糕的是,使用吨的经常表现形式和产生不记我的期望。理想情况下,我想收到XHTML在的输出。为推断"设置高亮HTML"转变的规则我使用这个网络分析器: http://www.bbcode.org/playground.php.它产生HTML这就是直觉正确对我意见。我唯一不喜欢也不会产生XHTML。例如 "[b][i]zzz[/b][/i]" 是转化为 "<b><i>zzz</b></i>" (注意的关闭标签的顺序)。萤火虫当然显示了这种作为 "<b><i>zzz</i></b><i></i>".我的理解是,浏览器修复这样的错误的结束标签的顺序的情况,但我在疑问:

  1. 我应该依靠这浏览器的要素,并不要试图让XHTML。
  2. 也许 "[b][i]zzz[/b]ccc[/i]" 必须被理解为 "<b>[i]zzz</b>ccc[/i]" -看起来为这样在逻辑上不正确的格式,但是在冲突与流行的论坛设置高亮的产出(*zzz****ccc*,不**[i]zzzccc[/i])

谢谢。

有帮助吗?

解决方案

在你的第一个问题,我不认为,依靠浏览器以正确的 任何 种错误是一个很好的想法不论的范围的项目(好吧,也许除了当你实际上做了错误的测试上的浏览器本身)。一些浏览器可能会做一个很棒的工作上,而其他人可能会失败得很惨。最好的方式,以确保输出法是正确的(或者至少为正确的,因为可能)是向它发送一个正确的语法可以浏览器放在第一位。

关于你的的第二个问题,因为你要有正确的设置高亮转换到正确HTML,如果你输入 [b][i]zzz[/b]ccc[/i], 其 正确的 HTML等会 <i><b>zzz</b>ccc</i> 而不 <b>[i]zzz</b>ccc[/i].而这就是事情变得复杂,因为你不可以写的只是一个转换器了,但也是一个法检查/correcter.我已经写了一个类似的脚本中PHP为一个相当奇怪的游戏机脚本语言,但是逻辑可以容易地适用于你的情况。基本上,我有一个标志设置为每个开始标记和检查,如果关闭标是在正确的位置。当然,这给有限的功能,但为什么我需要它做的伎俩。如果你需要更多的高级搜索模式,我觉得你坚持用regex.

其他提示

如果你只要实现B,我和U,这是不是非常重要的标签,为什么不只是有一个反对这些标记:+1每次打开,并-1每次关闭。

在结束一个论坛员额(或者)如果存在仍然开放标签,只要接近他们。如果用户将在无效设置高亮,这可能看起来很奇怪期间,他们的岗位,但它不会是灾难性的。

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

  1. 带它出去
  2. 它打印的字面,即不要把这转换为HTML
  3. 试图解决它。

我不建议3.它变得非常棘手的真快。1和2都是合理的选项。

至于如何分析设置高亮,我强烈反对使用regex.设置高亮实际上是一个相当复杂的语言。最重要的是,它所支持的筑巢的标签。Regex不能处理任意嵌套。这是一个基本限制regex.这使得一个不错的选择,用于解析的语言,如HTML,并设置高亮.

对于我自己的项目, rbbcode, 我用一分析表达的语法(PEG)。我建议使用类似的东西。在一般情况下,这些类型的工具称为"编译器编译器,""编译器发电机、"或"解析生成器。" 使用这些可能是比较好的做法,因为它允许指定的语法设置高亮,干净,可读的格式。你就会有较少的错误这样比如果你使用regex或试图建立自己的国家机。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top