【问题标题】:json_decode: 'Syntax error' for valid JSON from HEREDOC stringjson_decode:来自 HEREDOC 字符串的有效 JSON 的“语法错误”
【发布时间】:2019-08-24 20:08:30
【问题描述】:

我有下面的 JSON 代码。根据onetwo JSON 验证器,它是有效的 JSON。


{
  "patterns": {
    "email": "/[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}/i",
    "phone": "/(?:(?:\\(?(?:0(?:0|11)\\)?[\\s-]?\\(?|\\+)44\\)?[\\s-]?(?:\\(?0\\)?[\\s-]?)?)|(?:\\(?0))(?:(?:\\d{5}\\)?[\\s-]?\\d{4,5})|(?:\\d{4}\\)?[\\s-]?(?:\\d{5}|\\d{3}[\\s-]?\\d{3}))|(?:\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{3,4})|(?:\\d{2}\\)?[\\s-]?\\d{4}[\\s-]?\\d{4}))(?:[\\s-]?(?:x|ext\\.?|\\#)\\d{3,4})?/"
  }
}

但是,当我尝试在 PHP 中使用 json_decode 函数进行解码时,我得到一个“语法错误”。这是我的 PHP 代码:

const JSON_CONFIG = <<<JSON
{
  "patterns": {
    "email": "/[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}/i",
    "phone": "/(?:(?:\\(?(?:0(?:0|11)\\)?[\\s-]?\\(?|\\+)44\\)?[\\s-]?(?:\\(?0\\)?[\\s-]?)?)|(?:\\(?0))(?:(?:\\d{5}\\)?[\\s-]?\\d{4,5})|(?:\\d{4}\\)?[\\s-]?(?:\\d{5}|\\d{3}[\\s-]?\\d{3}))|(?:\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{3,4})|(?:\\d{2}\\)?[\\s-]?\\d{4}[\\s-]?\\d{4}))(?:[\\s-]?(?:x|ext\\.?|\\#)\\d{3,4})?/"
  }
}
JSON;

$config = json_decode(mb_convert_encoding(JSON_CONFIG, "UTF-8"), true); // Tried called trim but it made no difference
echo 'json_last_error_msg() => ' . json_last_error_msg() . PHP_EOL;
print_r($config); // Doesn't get to run

自己试试吧:https://repl.it/@DanStevens/PHP-jsondecode-Syntax-Error

知道json_decode 不喜欢这个有效的 JSON 吗?是不是和HEREDOC的使用有关?

【问题讨论】:

    标签: php json heredoc


    【解决方案1】:

    反斜杠充当 PHP 转义序列,而不是 JSON 转义序列。为防止 PHP 转义,请将 heredoc 开始标记括在单引号中:

    const JSON_CONFIG = <<<'JSON'
    {
      "patterns": {
        "email": "/[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}/i",
        "phone": "/(?:(?:\\(?(?:0(?:0|11)\\)?[\\s-]?\\(?|\\+)44\\)?[\\s-]?(?:\\(?0\\)?[\\s-]?)?)|(?:\\(?0))(?:(?:\\d{5}\\)?[\\s-]?\\d{4,5})|(?:\\d{4}\\)?[\\s-]?(?:\\d{5}|\\d{3}[\\s-]?\\d{3}))|(?:\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{3,4})|(?:\\d{2}\\)?[\\s-]?\\d{4}[\\s-]?\\d{4}))(?:[\\s-]?(?:x|ext\\.?|\\#)\\d{3,4})?/"
      }
    }
    JSON;
    
    var_dump(JSON_CONFIG);
    echo PHP_EOL;
    
    $config = json_decode(mb_convert_encoding(JSON_CONFIG, "UTF-8"), true); // Tried called trim but it made no difference
    echo 'json_last_error_msg() => ' . json_last_error_msg() . PHP_EOL;
    echo 'json_last_error() => ' . json_last_error() . PHP_EOL;
    print_r($config);
    

    回复:https://repl.it/repls/AmusedOvercookedEmbed

    【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多