私は 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
andの内容をkey3
キーと値のペアkey4
として、項目の配列 (ネストされたブラケットを折りたたむ)などとして読み取るかどうかは、プログラム次第です。
絶対に中括弧 ( {}
) を使用する必要はありません — たとえば、Lisp については何も知りませんが、括弧 ( ()
) を使用しているようです (そして、Tcl に影響を与えたようです — 確かにここには関連する歴史がたくさんあります...)、これで問題ありません。
上記の例は一貫していると思いますが、よくわかりません。「(先頭と末尾以外に)空白がない場合は、単一のリテラルエンティティとして扱い、それ以外の場合は配列として扱う」というルールだと思います。
すべてがリストであるこの種のデータの正式な用語はありますか?
これを行うためにPHP関数を書き始める前に、既存の関数または上記の変換を行う巧妙な方法を知っている人はいますか?
アップデート:
@glennjackman は、私の例に一貫性がないことを指摘しています。3 番目のエンティティkey4
は次のようになります。
[2] => (
[0] => "item3",
[1] => "has",
[2] => "spaces",
[3] => "in",
[4] => "it",
),
残念ながら、これは私が想像していた結果ではありませんでした。さらに考えた結果、私が望むものを得るためには、二重引用符を使用するか、リテラルとして解釈する規則として a に続く空白の欠如を使用するなど、リテラルを示す交互に区別可能な方法を導入する必要があると思います。""
{
より洗練された解決策が思いつくまでは、今のところ後者を使用します。つまり、左中括弧の直後に空白以外の文字が続く場合、左中括弧のすべての内容をリテラル文字列と見なします。{