将不带引号的 JSON 字符串解析为多维关联数组

问题描述 投票:0回答:3

我一直致力于将特定格式的字符串转换为数组。使用

explode
分割字符串似乎不是正确的方法,而且我不太擅长正则表达式。所以我的问题是如何将以下字符串转换为数组?

字符串的当前格式

maxWidth: 800,
openEffect: elastic,    
closeEffect: elastic,
helpers : {
       title : {
             type: outside
           },
       thumbs : {
              width  : 50,
              height : 50
            }
      }

所需数组

array(
  'maxWidth' => 800,
  'openEffect' => 'elastic',
  'closeEffect' => 'elastic',
  'helpers' => array(
               'title' => array('type' => 'outside'),
               'thumbs' => array('width' => 50, 'height' => 50)
             )
)

任何帮助将不胜感激。

根据回复进行编辑:

该字符串看起来像 JSON,但它不是 JSON。它只是用户以该格式输入的字符串。输入将来自普通用户,所以我想保持简单。普通用户输入有效 JSON 的可能性极小。

php arrays json text-parsing
3个回答
2
投票

示例中的字符串几乎是有效的 JSON(JavaScript 对象表示法)结构!

这是您的字符串作为有效 JSON 的样子

 {
    "maxWidth": 800,
    "openEffect": "elastic",
    "closeEffect": "elastic",
    "helpers": {
        "title": {
            "type": "outside"
        },
        "thumbs": {
            "width": 50,
            "height": 50
        }
    }
}

因此,我们的方法(按照@WiseGuy的建议)是首先用

preg_replace
注入一些字符,以 将字符串 init 转换为有效的 JSON:

$str = preg_replace('/\b/' , '"' , $str);
$str = '{'  . $str . '}';

上面的正则表达式使用

Word Boundaries
锚点在所有单词周围添加引号。然后我们将整个内容包裹在大括号中,瞧,我们就得到了 x 语言兼容的对象格式。

我们现在可以使用标准函数来生成我们的对象:

$objUserConfig = json_decode($str, true);

这里有一个很好的 JSON 初学者教程:http://code.drewwilson.com/entry/an-introduction-to-json

使用 linter 工具(例如 http://jsonlint.com/)来验证 JSON。我用它来调试您的示例并将其转换为适合我的示例的 JSON。


1
投票

您的输入字符串看起来像 json 格式。 PHP 有

json_decode()
将 json 字符串转换为对象。

要转换为数组,请使用以下代码:

json_decode($jsonStr, true);

参考:http://php.net/manual/en/function.json-decode.php


1
投票

编辑:我知道您正在显示数组的打印输出并且
不是 php 声明数组的静态表示。这只是一个
如何将其转换为可以解析的内容的示例
进入该数组。 php 是否具有动态执行此操作的能力(我不知道)。

转换文件,读入$str

按照这个顺序,对 $str 执行正则表达式。
每个都是全球旗帜。

(?i)([a-z]+)
'$1'

(?i)(?<=[a-z]')\s*:(?=\s*[^{\s])
=>

(?i)(?<=[a-z]')\s*:\s*{
=> array(

}
)

最后

$newstr = "array(\n$str\n)"

然而,像这样的东西可以被 php 解析器读取为静态
大批。我不知道它是如何动态解释为变量的。
Perl 可以做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.