2

我坚持将特定格式的字符串转换为数组。使用拆分字符串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 的可能性很小。

4

3 回答 3

2

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

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

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

所以我们的方法(正如@WiseGuy 所建议的那样)是首先注入一些字符preg_replace将您的字符串初始化转换为有效的 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

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

于 2013-10-04T16:25:20.513 回答
1

您的输入字符串看起来像 json 格式。PHP 必须json_decode()将 json 字符串转换为对象。

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

json_decode($jsonStr, true);

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

于 2013-10-04T16:26:57.157 回答
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 可以做到这一点。

于 2013-10-04T16:42:33.663 回答