面临 parse_str() 问题,将 + 字符替换为 space

Facing issue with parse_str(), Replacing + char to space

我有以下字符串 url:

HostName=MyHostName;SharedAccessKeyName=SOMETHING;SharedAccessKey=VALUE+VALUE=

我需要提取数组中的键值对。我在 PHP 中使用了 parse_str() 下面是我的代码:

<?php
$arr = array();
$str = "HostName=MyHostName&SharedAccessKeyName=SOMETHING&SharedAccessKey=VALUE+VALUE=";
parse_str($str,$arr);
var_dump($arr);

输出:

array (
  'HostName' => 'MyHostName',
  'SharedAccessKeyName' => 'SOMETHING',
  'SharedAccessKey' => 'VALUE VALUE=',
)

你可以看到在 SharedAccessKey 字符 + 被替换为 space 对于这个问题,我参考了 ,标记的答案是不正确的对于 OP 场景,这表示首先执行 urlencode() 然后传递它,因为 parse_str() 首先解码 URL 然后分离键值,但这将 return 的数组对象单个数组 return 整个字符串就像我的情况一样它的输出是这样的:

Array
(
    [HostName=MyHostName&SharedAccessKeyName=SOMETHING&SharedAccessKey=VALUE+VALUE=] => 
) 

请帮帮我,不仅仅是 + 个字符,而是所有字符都应该与 parse_str()

相同

您可以尝试用 preg_match_all 模拟 parse_str:

preg_match_all('/(?:^|\G)(\w+)=([^&]+)(?:&|$)/', $str, $matches);
print_r(array_combine($matches[1], $matches[2]));

输出:

Array (
    [HostName] => MyHostName
    [SharedAccessKeyName] => SOMETHING
    [SharedAccessKey] => VALUE+VALUE= 
)

Demo on 3v4l.org

$str = "HostName=MyHostName&SharedAccessKeyName=SOMETHING&SharedAccessKey=VALUE+VALUE="; preg_match_all('/(?:^|G)(w+)=([^&]+)(?:&|$)/', $str, $matches); print_r(array_combine($matches[1], $matches[2]));