如何在PHP中将URL编码的查询字符串解析为数组(不更改名称)
我知道你在想什么。“我能很快回答这个问题!这是如何在PHP中将URL编码的查询字符串解析为数组(不更改名称),php,Php,我知道你在想什么。“我能很快回答这个问题!这是parse_str函数!”但我有一点要告诉你 您可以看到,PHP将所有查询数据的名称转换为有效的PHP变量名称。什么?即使它们没有被存储为变量?记录在哪里?事实并非如此 $payload = 'data.name=value&data.other=value2'; parse_str($payload, $values); var_export($values); // Outputs: array('data_name' => 'v
parse_str
函数!”但我有一点要告诉你
您可以看到,PHP将所有查询数据的名称转换为有效的PHP变量名称。什么?即使它们没有被存储为变量?记录在哪里?事实并非如此
$payload = 'data.name=value&data.other=value2';
parse_str($payload, $values);
var_export($values);
// Outputs: array('data_name' => 'value', 'data_other' => 'value2')
// Expected: array('data.name' => 'value', 'data.other' => 'value2')
如何在不发生这种情况的情况下解析查询字符串?该函数在PHP文档中有完整的文档记录。如果输出不适用于您的特定用例,那么您必须使用另一个函数,或者创建自己的函数。这里的关键是该函数将字符串解析为变量 parse_str-将字符串解析为变量 将str解析为通过URL传递的查询字符串,并在当前范围内设置变量 要分析您提供的字符串,可以这样做:
$payload = 'data.name=value';
$map = array();
$vals = preg_split('/=/', $payload);
$i= 0;
while($i < count($vals)) {
$map[$vals[$i]] = $vals[++$i];
$i++;
}
var_dump($map);
$payload='data.name=value';
$map=array();
$VAL=preg_split('/=/',$payload);
$i=0;
而($i
您可以通过自己解析查询字符串来避免PHP重命名参数名。拆分&
和=
字符上的字符串,然后拆分每个部分:
<?php
$payload = 'data.name=value&data.other=value2';
$values = array();
$nv_strings = explode ('&', $payload);
foreach ($nv_strings as $s) {
$nv = explode ('=', $s, 2);
$name = urldecode ($nv[0]);
$value = (isset ($nv[1]) ? urldecode ($nv[1]) : null);
$values[$name] = $value;
}
print_r ($values);
// Array
// (
// [data.name] => value
// [data.other] => value2
// )
在这个特定的示例中,您期望/最终输出得到什么?为您添加了期望:
行。我有这一行失败,还有更多。。在我迁移到JSON配置之后。如果它似乎没有按照您想要的方式进行,那么您可以自己编写/汇总。您还提供了一个弱输入测试用例。用什么分隔键-值对?您的引用只是说它解析字符串与通过URL传递的查询相同。我所描述的行为是否也适用于该字符串?meustrus重新阅读了它。它将字符串解析为当前范围内的变量。因此,$values['data\u name']
将存在。这是一种奇怪的方式。explode()
有什么问题吗?如何拆分由和分隔的多个参数?当一个foreach
就足够了时,为什么复杂的循环会在两个地方进行迭代呢?
<?php
$payload = 'key=val1&key=val2&key=val3';
$values = array();
$nv_strings = explode ('&', $payload);
foreach ($nv_strings as $s) {
$nv = explode ('=', $s, 2);
$name = urldecode ($nv[0]);
$value = (isset ($nv[1]) ? urldecode ($nv[1]) : null);
$values[] = array ($name => $value);
}
print_r ($values);
// Array
// (
// [0] => Array ([key] => val1)
// [1] => Array ([key] => val2)
// [2] => Array ([key] => val3)
// )
<?php
$payload = 'key1=val1&key1=val2&key2=val3';
$values = array();
$nv_strings = explode ('&', $payload);
foreach ($nv_strings as $s) {
$nv = explode ('=', $s, 2);
$name = urldecode ($nv[0]);
$value = (isset ($nv[1]) ? urldecode ($nv[1]) : null);
if (isset ($values[$name])) {
if (is_array ($values[$name])) {
$values[$name][] = $value;
} else {
$values[$name] = array ($values[$name], $value);
}
} else {
$values[$name] = $value;
}
}
print_r ($values);
// Array
// (
// [key1] => Array ([0] => val1
// [1] => val2)
// [key2] => val3
// )
<?php
$payload = 'key1=val1&key1=val2&key2=val3';
$values = array();
$nv_strings = explode ('&', $payload);
foreach ($nv_strings as $s) {
$nv = explode ('=', $s, 2);
$name = urldecode ($nv[0]);
$value = (isset ($nv[1]) ? urldecode ($nv[1]) : null);
if (isset ($values[$name])) {
$values[$name][] = $value;
} else {
$values[$name] = array ($value);
}
}
print_r ($values);
// Array
// (
// [key1] => Array ([0] => val1
// [1] => val2)
// [key2] => Array ([0] => val3)
// )