【问题标题】:RegEx is Malforming My JSONRegEx 使我的 JSON 格式不正确
【发布时间】:2014-07-30 22:13:35
【问题描述】:

这很不寻常。我有以下 JSON 文件:

settings.json

{
    "somekey":"someval",
    "regexes":{
        "url":"/([^\/]+)(?:\/\(([^\)]+)\))?\/?([\S]+)?/"
    }
}

PHP

var_dump(json_decode(file_get_contents('settings.json'),true)) 返回 null 并带有 json_last_error() 说我的 JSON 格式错误。

我一直在检查它是否不喜欢我的正则表达式中的某些字符...删除随机位并检查...有时它返回我的 JSON 对象,有时它返回 null,但我似乎无法缩小任何范围。我在这里错过了什么?

【问题讨论】:

  • 我想这是返回普通 PHP 数组作为配置首选的原因列表中的一项。
  • 相对于 stdClass 对象?是的,我一开始是在处理对象,然后我遇到了一个带有破折号的设置(“some-setting”),它不适用于对象:$settings->some-setting... 所以必须在我引用 stdClass 的所有地方重写转换为数组:$settings['some-setting']
  • 你可以像$settings->{"some-setting"}那样做你想做的事。
  • @Marty 甜!我无法弄清楚它的语法......非常感谢。

标签: php regex json


【解决方案1】:

反斜杠必须在 JSON 中转义。这是有效的:

{
    "somekey":"someval",
    "regexes":{
        "url":"/([^\\/]+)(?:\\/\\(([^\\)]+)\\))?\\/?([\\S]+)?/"       
    }
}

var_dump 的输出将是:

array(2) {
  ["somekey"]=>
  string(7) "someval"
  ["regexes"]=>
  array(1) {
    ["url"]=>
    string(40) "/([^\/]+)(?:\/\(([^\)]+)\))?\/?([\S]+)?/"
  }
}

【讨论】:

  • 成功了!是不喜欢单反斜杠的 JSON 还是 json_decode 函数?
  • 这是一个JSON thing,您文件中的 JSON 在没有转义反斜杠的情况下无效。这也适用于许多(大多数?)其他语言,包括 PHP。 @flec 建议使用四个斜杠的原因是因为在 PHP 中,每个反斜杠都必须被转义,所以每四个反斜杠就剩下两个。由json_decode 解析的结果字符串对于我们的两个答案都是相同的。
【解决方案2】:

对于要打印为反斜杠的每个反斜杠,您需要四个反斜杠。因此,以下给出了您预期的结果:

<?php 
    $json = '{
        "somekey":"someval",
        "regexes":{
            "url":"/([^\\\\/]+)(?:\\\\/\\\\(([^\\\\)]+)\\\\))?\\\\/?([\\\\S]+)?/"
        }
    }';

    var_dump(json_decode($json));

输出:

object(stdClass)#1 (2) {
  ["somekey"]=>
  string(7) "someval"
  ["regexes"]=>
  object(stdClass)#2 (1) {
    ["url"]=>
    string(40) "/([^\/]+)(?:\/\(([^\)]+)\))?\/?([\S]+)?/"
  }
}

【讨论】:

  • +1,但似乎两个反斜杠输出一个反斜杠
猜你喜欢
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 2017-01-19
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多