PHP wiki标记解析器

时间:2011-08-11 01:25:18

标签: php parsing wiki markup

我被告知在PHP中编写一个依赖于正则表达式和preg函数的wiki标记解析器是一个坏主意。但我不知道为什么。

那么在PHP中编写wiki标记解析器的最佳方法是什么?这是一个学术“项目”,而不是其他任何东西,所以重点是自己写。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

你被告知,因为“wiki语言”至少可以说是定义
真正糟糕的部分是“试图解析”它们,而不是“使用php和regexps”

事实上,我认为他们实际上是使用正则表达式处理 (直接进入html,而不是从中间抽象语法树表示中传递) mediawiki <等软件中/ strong>即可。没有正则表达式的AFAIK实际解析在PHP中效率很低。 (除非您使用特定的已编译PHP模块进行解析)

请注意,这些软件还具有许多可以按需激活的语法功能,而且可能难以有效编写。

只有真正的麻烦?你必须使用很多转义来解析像[]这样的字符,当你使用preg_match()和php的许多反斜杠时很容易混淆。除此之外,一个简单的preg_match_all('#\\[\\[(.*?)\\]\\]#',$data,$matches,PREG_SET_ORDER);应该让你开始运行。

(除非我对太多的反斜杠感到困惑,就是这样):)

答案 1 :(得分:2)

问题可能是你必须在维基页面的整个内容中一次运行一个正则表达式,这需要大量的处理时间。一个简单的解决方案是为标记使用某种分隔符,例如[[,然后从头到尾依次处理文本。每次找到代码时,都会搜索结束代码]]

接下来,使用您定义的任何规则处理其间的内容。这可以使用简单的字符串索引和替换操作来完成,并且不需要多次处理整个字符串,而是只需要遍历整个字符串一次。