在php中构建标记解析器

时间:2009-11-23 21:33:02

标签: php parsing markup

我在php中创建了一个非常简单的标记解析器。但是,它目前使用str_replace在标记和html之间切换。如何创建一个“代码”框(最终将使用GeSHI),其内容未受影响?

现在,以下标记:[code][b]Some bold text[/b][/code]最终解析为<b>Some bold text</b>的代码框。

我需要一些建议,哪个选项最好?

  • 让它单独检查每个单词,如果它不在[code]框中,它应该解析
  • 保持原样,让用户无法在[code]内发布标记。
  • 专门为HTML标记创建另一种类型的代码框,让[code]自动反转任何&lt;或者&gt;到[和]。

还有其他选择吗?这比我想象的要难一点......

编辑:是否值得为此解析器添加代码框类型的东西?我的意思是,我看到它是如何有用的,但对于一个小结果来说,这是一个相当大的努力。

4 个答案:

答案 0 :(得分:3)

你为什么要重新发明轮子?

已经有很多markup parsers

无论如何,只是str_replace无济于事。您必须学习正则表达式,正如他们所说,now you've got two problems;)

答案 1 :(得分:2)

为了使用str_replace,您可以将其分解为多个字符串。拆分[code]和[/ code]标签上的字符串 - 将代码框保存在单独的字符串中。以某种方式记下它在原始字符串中的位置。然后在原始字符串上使用str_replace,并在代码框字符串上执行您喜欢的任何解析。最后重新插入已解析的代码框并显示。

只是提醒一句,将输入转换成html进行显示会让我感到非常危险。在转换为html进行重新显示之前,我建议进行大量的输入清理和检查。

答案 2 :(得分:0)

HTML美化非常甜蜜。 http://pear.php.net/package/PHP_Beautifier。有一个装饰类也可能适合你的需要。

答案 3 :(得分:0)

要清楚,您的问题分为两部分。第一部分是需要一个词法分析器将你的“代码”分解为你的“语言”的关键词。一旦你有了词法分析器,你就需要一个解析器。解析器是一种代码,它以逻辑(通常是递归 - 下降的方式)方式一次一个地接受您的语言的关键字。