是否可以使用包含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"] ==" /" 。我正在尝试扩展Blade Templating,以便我可以实现解析的函数,例如:
@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对象。
答案 0 :(得分:0)
那是因为你在字符串中使用了一个未被解析的变量。此外,$_SERVER["REQUEST_URI"] == "/"
会返回false
。如果布尔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);
答案 1 :(得分:0)
我认为你是在正确的轨道,但不是试图通过单引号“模拟”解码,为什么不(为了你的概念证明)首先ENCODE,然后'echo'/'打印'它返回的值,然后解码以查看它返回的内容。
答案 2 :(得分:0)
为什么不使用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);
答案 3 :(得分:0)
正如您在输出中可以清楚地看到的那样,您的第一个数组根本不包含任何PHP。
$array = ["page", "is-home", $_SERVER["REQUEST_URI"] == "/"];
使用布尔值$array[2]
自动填充false
,而不是使用PHP代码填充。
所以,我们假设您不能在客户端上进行这样的计算(实际上,您也可以在javascript中进行此计算)。因此,您必须将其作为json字符串(正确编码)发送到服务器,解码,评估它,并将结果发回数组。
$json = '["page", "is-home", "$_SERVER[\"REQUEST_URI\"] == \"/\""]';
$array = json_decode($json);
$array[2]=eval($array[2]);
但请不要这样做!这是一个很大的安全漏洞。
相反,请随意提出一个新问题,了解如何在javascript中进行此计算。
答案 4 :(得分:0)
根据您的情况,您可以这样做:
$is_home = $_SERVER["REQUEST_URI"] == "/";
$json = '["page", "is-home", '. $is_home .']';
$array = json_decode($json);