您好我想制作一种类似于元语言的东西,它会被解析和缓存以提高性能。所以我需要能够将元代码解析为对象或数组。
Startidentifier:{
Endidentifier:}
您可以使用点(。)浏览对象,但也可以进行算术/逻辑/关系操作。
以下是元语言的示例:
或嵌套
或与操作
或更符合逻辑
我想你们大多数人已经理解了我想要的东西。目前我只能做简单的操作(没有嵌套,只有2个值),但是使用动态属性名获取值的嵌套工作正常。文本连接也很好
e.g。 “你好{myObj.name}!你好{myObj.type}?”。
如果喜欢(条件),也可以做空吗? (真实情况):(假案例)会很好,但我不知道如何解析所有这些东西。我目前正在使用带有一些正则表达式的循环,但如果我在正则表达式中有更多,它可能会更快,甚至更可维护。
那么有人可以给我一些提示或者想帮助我吗?也许访问项目网站以了解我需要的内容:http://sourceforge.net/projects/blazeframework/
提前致谢!
答案 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标志!?