【问题标题】:Can I decode JSON containing PHP code?我可以解码包含 PHP 代码的 JSON 吗?
【发布时间】:2015-01-16 18:20:37
【问题描述】:

是否有可能有一个包含 PHP 代码的 JSON 字符串,并对此字符串进行解码?

例如,这可以正常工作:

$array = ["page", "is-home", $_SERVER["REQUEST_URI"] == "/"];
var_export($array); 
// array (
//   0 => 'page',
//   1 => 'is-home',
//   2 => false,
// )

这个不行:

$json = '["page", "is-home", $_SERVER["REQUEST_URI"] == "/"]';
$array = json_decode($json); // returns NULL
echo json_last_error_msg(); // Syntax error

第二个示例仅在 $_SERVER["REQUEST_URI"] == "/" 从 json 字符串中删除时才有效。

有没有办法使用 json_decode 解析这个字符串,如果没有,是否有替代方法来完成这个?

非常感谢!

更新

$_SERVER["REQUEST_URI"] == "/" 必须被解析。我正在尝试扩展刀片模板,以便我可以实现这样的解析函数:

@add-request('page', 'is-home', $_SERVER["REQUEST_URI"] == '/')

更新 #2

为了简化问题,我需要把一个字符串变成一个对象。

$str = '["page", "is-home", $_SERVER["REQUEST_URI"] == "/"]'; // this is obtained by parsing the top blade extension (not important how)

从字符串中我需要以下数组:

$array = ["page", "is-home", true / false ]

请记住,理论上,原始字符串可以包含 JSON 值之一的任何 PHP 对象。

【问题讨论】:

  • 第二个例子看起来不像是有效的 JSON 语法,所以它不应该被解码。您可以(但请不要这样做)将所有内容包含在字符串标记中,然后对其进行评估(请不要这样做,请不要这样做)。
  • 感谢您的建议。我决心找到另一种方法而不是使用 eval,即使这意味着自己解析字符串。谢谢!
  • 实际上想要做什么?
  • 好的,您的第二次更新清除了它。我认为 json 函数不是您应该寻找的。您所拥有的不是有效的 json 字符串,因此不能这样解析。即使可以,php 部分仍然不会被评估。您唯一的选择是手动或通过 eval(包括所有问题)将字符串评估为 php 代码。
  • 有点,但我不知道如何在 Blade 中最好地做到这一点。我建议您发布一个新问题,对您的目标进行这种高级别的解释,并让某人向您解释在 Blade 中实现此目的的惯用方式。

标签: php json parsing blade


【解决方案1】:

那是因为您在字符串中使用了一个未解析的变量。此外,$_SERVER["REQUEST_URI"] == "/" 返回false。 Boolean false 如果连接到字符串,将被转换为空字符串。

你应该把你的代码改写成这样:

// Is the request URI equal to "/"?
$reqUriTest = ($_SERVER["REQUEST_URI"] == "/");

// If boolean false is converted to a string, it will become an empty string.
// So we need to explicitly use values "true" or "false".
$reqUriStr = ($reqUriTest ? "true" : "false");

// Now we can insert $reqUriStr into the JSON string.
$json = '["page", "is-home", '.$reqUriStr.']';
$array = json_decode($json);

【讨论】:

  • 不幸的是,这段代码必须被解析,我不能使用它
【解决方案2】:

对于您的情况,您可以这样做:

$is_home = $_SERVER["REQUEST_URI"] == "/";
$json = '["page", "is-home", '. $is_home .']';
$array = json_decode($json);

【讨论】:

    【解决方案3】:

    您可以在输出中清楚地看到,您的第一个数组根本不包含任何 PHP。

    $array = ["page", "is-home", $_SERVER["REQUEST_URI"] == "/"];
    

    用布尔值false 自动填充$array[2],而不是PHP 代码。

    所以,假设您不能在客户端上进行这样的计算(事实上,您也可以在 javascript 中进行这种计算)。因此,您必须将其作为 json 字符串(正确编码)发送到服务器,对其进行解码、评估,然后将结果发送回数组中。

    $json = '["page", "is-home", "$_SERVER[\"REQUEST_URI\"] == \"/\""]';
    $array = json_decode($json);
    $array[2]=eval($array[2]);
    

    但请不要这样做!这是一个很大的安全漏洞。

    相反,您可以提出一个新问题,您也可以在 javascript 中进行此计算

    【讨论】:

    • 感谢您的建议。这确实是我试图避免的一个可能的选择。请查看我最近的更新。
    • 如果你想解析任意表达式,没有比eval更好的方法了。如果您需要一个小的固定表达式子集,您可以使用关键字和正则表达式。所以,如果你只想允许检查服务器变量是否相等,你可以检查字符串是否匹配\{([A-Z_]*)==([A-Za-z0-9]*)\},如果匹配,用$_SERVER[\\1]==\\2替换它(对不起,我不擅长正则表达式,但我只是希望你能得到这个想法)。然后用户可以给出字符串{REQUEST_URI==\},然后你解析它。 BBCODE 就是这样工作的。
    • 有道理,我会考虑这个。似乎是目前最好的选择。
    • 希望我能投票给你,但似乎我还没有所需的 15 点声誉:p
    【解决方案4】:

    为什么不用json_encode()来获取json字符串??

    // create json string by json_encode() from array
    $json  = json_encode([
        "page",
        "is-home",
        $_SERVER["REQUEST_URI"] == "/"
    ]);
    // decode the encoded string with no error, of course ....
    $array = json_decode($json);
    

    【讨论】:

      【解决方案5】:

      我认为您走在正确的轨道上,但与其尝试通过放置单引号来“模拟”解码,不如(为了您的概念证明)首先 ENCODE,然后 'echo' / 'print'它返回的值,然后解码以查看它返回的内容。

      【讨论】:

        猜你喜欢
        • 2010-12-29
        • 1970-01-01
        • 2012-10-26
        • 1970-01-01
        • 1970-01-01
        • 2020-10-05
        • 1970-01-01
        • 2023-03-19
        相关资源
        最近更新 更多