由于我习惯了 Tcl 并且喜欢它的简单性,我想创建和解析表单的配置文件,
block
{
key1 val1
key2 val2
key3
{
subkey1 subval1
subkey2 subval2
}
key4
{
item1
item2
{item3 has spaces in it}
{item4 {has {bra{ck}ets}} in it}
}
}
对于上面的例子,我期望的 PHP 数组是:
[0] => "block",
[1] => (
[0] => "key1",
[1] => "val1",
[2] => "key2",
[3] => "val2",
[4] => "key3",
[5] => (
[0] => "subkey1",
[1] => "subval1",
[2] => "subkey2",
[3] => "subval2"
),
[6] => "key4",
[7] => (
[0] => "item1",
[1] => "item2",
[2] => "item3 has spaces in it"
[3] => (
[0] => "item4",
[1] => (
[0] => "has",
[1] => "bra{ck}ets"
),
[2] => "in",
[3] => "it"
),
)
由程序决定读取block
和key3
作为键值对的内容,key4
作为项目数组(折叠嵌套括号)等等。
我不一定非得使用大括号 ( {}
)——例如,虽然我对 Lisp 一无所知,但它似乎使用了括号 ( ()
)(看起来它影响了 Tcl——我确定我错过了一个这里有很多相关的历史......),这很好。
我认为上面的例子是一致的,但我不确定。我认为规则是,“如果没有空格(除了前导和尾随),则视为单个文字实体;否则,视为数组。”
这种数据是否有一个官方术语,其中一切都是一个列表?
在我开始编写 PHP 函数来执行此操作之前,有没有人知道现有函数或进行上述转换的一些聪明方法?
更新:
@glennjackman 指出我的例子是不一致的,确实如此。下的第三个实体key4
应该是:
[2] => (
[0] => "item3",
[1] => "has",
[2] => "spaces",
[3] => "in",
[4] => "it",
),
然而不幸的是,这不是我想象的输出。经过进一步思考,我认为为了得到我想要的,有必要引入一种交替可区分的方式来指示文字,例如使用双引号""
,或者使用 a 后面的空白{
作为规则来解释为文字。
现在,我会选择后者,直到我想出一个更优雅的解决方案。也就是说,如果左大括号{
后面紧跟一个非空白字符,则考虑左大括号的所有内容,即文字字符串。