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

これを使って:

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

4 つのバックスラッシュに注意してください。

根拠:一重引用符で囲まれた文字列であっても、バックスラッシュにはエスケープ機能があります。あなた'\''には文字列があります'(単一引用符のみ)。したがって、バックスラッシュもエスケープする必要があります。'\\'文字列です\(バックスラッシュのみ)。

しかし、なぜバックスラッシュを 4 倍にするのでしょうか?

変数を代入する$configと、2 つのバックスラッシュが失われます。それらは「使用済み」です。

次に、JSON 自体に残りの 2 つのバックスラッシュが必要です。

実行ログ:

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 に答える
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 に答える