如何在json(PHP)中使用正则表达式?

时间:2010-02-09 10:07:28

标签: php regex json

现在我有一个像这样的json代码:

{"1":
    {
    "text":"e1",
    "children":
        {
        "1":
            {
            "text":"e1_site1",
            "children":
                {"1":"e1_site1_salarie1_nom"}
            },
        "3":
            {
            "text":"e1_site2",
            "children":
                {
                "3":"e1_site2_sa1",
                "4":"e1_site2_sa2"
                }
            }
        }
    },
"2":
    {
    "text":"e2",
    "children":
        {
        "2":
            {
            "text":"e2_site2",
            "children":
                {
                "2":"e2_site2_salarie2_nom"
                }
            }
        }
    }
}

我希望它是:

[
    {
    "text":"e1",
    "children":
    [
        {
        "text":"e1_site1",
        "children":
        [
            {
            "text":"e1_site1_salarie1_nom"
            }
        ],
        "text":
            {
            "text":"e1_site2",
            "children":
            [
                {
                "text":"e1_site2_sa1"
                },
                {
                "text":"e1_site2_sa2"
                }
            ]
            }
    ],
    "text":
        {
        "text":"e2",
        "children":
        [
            {
            "text":"e2_site2",
            "children":
            [
                {
                "text":"e2_site2_salarie2_nom"
                }
            ]
            }
        ]
        }

我现在做了什么,它还没完成并完成了:

$json = json_encode($entreprise);
$mode = array("/{\"[0-9]\":{\"text\"/", "/children\":{\"[0-9]\"/","/,\"[0-9]\":{\"/", "/,\"[0-9]\":\"/","(}})");
$replacement = array("[{\"text\"","children\":[{\"text\"",",\"text\":{\"",",\"text\":\"","}]");
$json = preg_replace($mode, $replacement, $json);
dump($json);

目前的结果:

[
    {
    "text":"e1",
    "children":
    [
        {
        "text":"e1_site1",
        "children":
        [
            {
            "text":"e1_site1_salarie1_nom"
            }
        ],
        "text":
            {
            "text":"e1_site2",
            "children":
            [
                {
                "text":"e1_site2_sa1",
                "text":"e1_site2_sa2"
                }
            ]
            }
    ],
    "text":
        {
        "text":"e2",
        "children":
        [
            {
            "text":"e2_site2",
            "children":
            [
                {
                "text":"e2_site2_salarie2_nom"
                }
            ]
            }
        ]
        }

你知道如何用正则表达式实现理想的输出吗?

任何想法或建议将不胜感激!提前致谢。 ;)

编辑:

输出根据soulmerge的推荐而改变。就像这样:

[
    {
    "text":"e1",
    "children":
        {
        "1":
            {
            "text":"e1_site1",
            "children":
                {
                "1":"e1_site1_salarie1_nom"
                }
            },
        "3":
            {
            "text":"e1_site2",
            "children":
                {
                "3":"e1_site2_sa1",
                "4":"e1_site2_sa2"
                }
            }
        }
    },
    {
    "text":"e2",
    "children":
        {
        "2":
            {
            "text":"e2_site2",
            "children":
                {
                "2":"e2_site2_salarie2_nom"
                }
            }
        }
    }
]

但是我的理想结果还有很长的路要走。

有谁知道怎么做?

3 个答案:

答案 0 :(得分:6)

正则表达式是您可以在这里使用的最差方法:

  • 如果您在3个月内回到此代码,您将无法理解所做的事情,
  • 很容易发现难以发现的错误,
  • 如果PHP决定更改其json生成代码,代码将中断

我建议在$entreprise数组上进行所有操作,不要冒任何风险,然后在其上调用json_encode()

生成的JSON具有对象而不是数组的原因是原始数组不是0索引的。试试这个,例如:

dump(json_encode(array_values($enterprise)));

答案 1 :(得分:1)

JSON不是常规语言,因此您无法使用正则表达式来解析它。并且您的预期输出不是有效的JSON,因为不能像

中那样多次出现相同的密钥
{
    "text":"e1_site2_sa1",
    "text":"e1_site2_sa2"
}

答案 2 :(得分:0)

你应该找到从json_encode输出所需json输出的方法,而不是输出你不想要的东西,然后用正则表达式欺骗它们。 所以我的猜测是你的数据结构而不是文本输出......