【发布时间】:2013-10-30 18:59:03
【问题描述】:
因为我有一个非常多余的配置文件格式。我发明了一种用于编写循环的自定义脚本格式,例如:
[Config Object]
{Loop 3
Setting[i] = Value[i]
}
OtherSetting=X
这将导致:
[Config Object]
Setting1 = Value1
Setting2 = Value2
Setting3 = Value3
OtherSetting = X
我的第一个想法是使用正则表达式,比如这个:
!{(.*?)}!is
在我尝试将它与嵌套循环一起使用之前,它的效果非常好 - 你肯定知道这个“哦,cr...时刻”
因为以下原因:
1: [Config Object]
2: *{*Loop 3
3: Section[i]
4: {Loop 3
5: Setting[i] = Value[i]
6: *}*
7: }
8: OtherSetting=X
将引导正则表达式覆盖第 2 行和第 6 行之间的范围(用 *s 营销它们)
实际上我真的不知道如何解决这个问题,因为正则表达式在逻辑上是正确的。
那个?需要惰性运算符,因为没有它我会在另一个方向遇到同样的问题,并且无法编写两个后续循环。
一点点研究让我清楚正则表达式在这里不是正确的方向, 但我找不到任何 PHP 解决方案。 那么我如何才能在 PHP 中高效地解析我的“循环”脚本,例如获取一个带有循环的数组并用计算结果替换大括号内的命令?
【问题讨论】:
-
你需要一个递归模式,看看this answer。
-
我现在记得我写了一个small parser,可能很有趣……
-
是的,“如何创建解析器”是一个相当广泛的话题,很难用一个答案来回答。解析器通常是一个状态机,从那里开始。看看一些简单的解析器,比如 JSON。请参阅我的个人资料以获取简单的 Rison 解析器。为了创建一种简单的语言,您需要一个抽象语法树。查看 Twig 之类的东西,了解一个像样的 AST 解析器。
-
结果应该是 3 个部分,每个部分包含 3 个设置。编辑:你为什么删除你的评论?
-
是的,他也可以实现这一点。同样的东西,不同的概念允许 cmets 和东西呢? regex101.com/r/mP3xP0
标签: php regex parser-generator