1

我在 json 数据中有一个正则表达式,

$config = '{"regex": "/font-size:\s*(?:.*);/i"}';

我想将json数据转换为数组,

$config = json_decode($config,true);

var_dump($config);

NULL由于正则表达式而返回。

我怎样才能解决它?

所以我可以得到这个,

Array
(
    [regex] => "/font-size:\s*(?:.*);/i"
)

是否可以?

编辑:

它返回,

array(1) {
  [0]=>
  string(37) '{"regex": "/font-size:\s*(?:.*);/i"}'
}

应该...

array(1) {
  ["regex"]=>
  string(22) "/font-size:\s*(?:.*);/i"
}
4

2 回答 2

2

你的 JSON 有JSON_ERROR_SYNTAX,所以你有错误

选项 A 你应该stripslashes先使用,但你会失去反斜杠\

$config = '{"regex": "/font-size:\s*(?:.*);/i"}';
$config = json_decode(stripslashes($config),true);
var_dump($config);

输出

array
  'regex' => string '/font-size:s*(?:.*);/i' (length=22)

选项 B创建自己的函数

$config = '{"regex": "/font-size:\s*(?:.*);/i"}';
var_dump(splitJSONObject($config));

输出

array
  'regex' => string '/font-size:\s*(?:.*);/i' (length=23)

使用的函数(仅拆分为数组

function splitJSONObject($json) {
    $json = str_replace(array("\\\\","\\\""), array("\","""), $json);
    $parts = preg_split("@(\"[^\"]*\")|([\[\]\{\},:])|\s@is", $json, - 1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    foreach ( $parts as $index => $part ) {
        if (strlen($part) == 1) {
            switch ($part) {
                case "[" :
                case "{" :
                    $parts[$index] = "array(";
                    break;
                case "]" :
                case "}" :
                    $parts[$index] = ")";
                    break;
                case ":" :
                    $parts[$index] = "=>";
                    break;
                case "," :
                    break;
                default :
                    return null;
            }
        } else {
            if ((substr($part, 0, 1) != "\"") || (substr($part, - 1, 1) != "\"")) {
                return null;
            }
        }
    }
    $json = str_replace(array("\",""","$"), array("\\\\","\\\"","\\$"), implode("", $parts));
    return eval("return $json;");
}
于 2012-10-14T17:02:54.557 回答
2

用这个:

$config = '{"regex": "/font-size:\\\\s*(?:.*);/i"}';

注意四个反斜杠。

理由:即使在单引号字符串中,反斜杠也具有转义功能。'\''你有一个字符串('仅限单引号)。因此,您还需要转义反斜杠。'\\'是字符串\(仅反斜杠)。

但是为什么要把反斜杠翻四倍呢?

分配变量$config时,您会丢失两个反斜杠。它们被“用完”了。

然后,JSON 本身需要剩余的两个反斜杠。

执行日志:

var_dump(json_decode('{"regex": "/font-size:\\\\s*(?:.*);/i"}'));

class stdClass#2 (1) {
  public $regex =>
  string(23) "/font-size:\\s*(?:.*);/i"
}

您在 JSON 输出中看到双反斜杠了吗?他们必须留下,否则 JSON 将无效。

于 2012-10-14T17:11:42.530 回答