使用preg_match在PHP中解析嵌套结构

时间:2010-08-05 21:40:24

标签: php regex parsing loops nested

您好我想制作一种类似于元语言的东西,它会被解析和缓存以提高性能。所以我需要能够将元代码解析为对象或数组。

Startidentifier:{

Endidentifier:}

您可以使用点(。)浏览对象,但也可以进行算术/逻辑/关系操作。

以下是元语言的示例:

  • {mySelf.mother.job.jobName}

或嵌套

  • {自己。{MyObj中。{键[ “ObjProps”] [0]}。personAttribute.first} .size}

或与操作

  • {obj.val *(otherObj.intVal + myObj.longVal)== 1200}

或更符合逻辑

  • {obj.condition ==!myObj.otherCondition}

我想你们大多数人已经理解了我想要的东西。目前我只能做简单的操作(没有嵌套,只有2个值),但是使用动态属性名获取值的嵌套工作正常。文本连接也很好

e.g。 “你好{myObj.name}!你好{myObj.type}?”。

如果喜欢(条件),也可以做空吗? (真实情况):(假案例)会很好,但我不知道如何解析所有这些东西。我目前正在使用带有一些正则表达式的循环,但如果我在正则表达式中有更多,它可能会更快,甚至更可维护。

那么有人可以给我一些提示或者想帮助我吗?也许访问项目网站以了解我需要的内容:http://sourceforge.net/projects/blazeframework/

提前致谢!

2 个答案:

答案 0 :(得分:1)

使用正则表达式解析不确定数量的匹配括号是非常重要的,因为通常情况下,要么匹配太多要么太少。

例如,考虑Hello {myObj.name}! {mySelf.{myObj.{keys["ObjProps"][0]}.personAttribute.first}.size}?在同一个字符串中使用输入中的两个示例:

如果你使用可能会想到的第一个正则表达式\{.*\}来匹配大括号,你将获得一个匹配:{myObj.name}! {mySelf.{myObj.{keys["ObjProps"][0]}.personAttribute.first}.size}这是因为默认情况下,正则表达式贪婪并尽可能匹配。

从那里,我们可以尝试使用非贪婪的模式\{.*?\},它在开始和结束括号之间尽可能少地匹配。使用相同的字符串,此模式将产生两个匹配项:{myObj.name}{mySelf.{myObj.{keys["ObjProps"][0]}。显然第二个不是完整表达式,但非贪婪模式将尽可能少地匹配,这是满足模式的最小匹配。

PCRE确实允许recursive regular expressions,但如果沿着那条路走下去,你将会得到一个非常复杂的模式。

在我看来,最好的解决方案是构造一个tokenizer(可以由regex提供支持),将你的文本变成一个可以解析的标记数组。

答案 1 :(得分:0)

或许可以查看PREG_OFFSET_CAPTURE标志!?