如何在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)
//  )