Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 面临parse_str()的问题,替换+;字符到空间_Php_Regex_Urlencode - Fatal编程技术网

Php 面临parse_str()的问题,替换+;字符到空间

Php 面临parse_str()的问题,替换+;字符到空间,php,regex,urlencode,Php,Regex,Urlencode,我有以下字符串url: HostName=MyHostName;SharedAccessKeyName=某物;SharedAccessKey=值+值= 我需要提取数组中的键值对。我在PHP中使用了parse_str(),下面是我的代码: <?php $arr = array(); $str = "HostName=MyHostName&SharedAccessKeyName=SOMETHING&SharedAccessKey=VALUE+VALUE="; parse_str

我有以下字符串url:

HostName=MyHostName;SharedAccessKeyName=某物;SharedAccessKey=值+值=

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

<?php
$arr = array();
$str = "HostName=MyHostName&SharedAccessKeyName=SOMETHING&SharedAccessKey=VALUE+VALUE=";
parse_str($str,$arr);
var_dump($arr);
您可以在
SharedAccessKey
char
+
中看到,对于这个问题,我引用了,根据OP场景,标记的答案不是正确的,这表示首先执行
urlencode()
,然后传递它,因为
parse_str()
首先解码URL,然后分离键值,但这将返回单个数组的数组对象,该数组返回整个字符串,就像我的情况一样,其输出如下:

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

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

相同。您可以尝试使用以下方法模拟
parse_str

输出:

Array (
    [HostName] => MyHostName
    [SharedAccessKeyName] => SOMETHING
    [SharedAccessKey] => VALUE+VALUE= 
)
$str=“HostName=MyHostName&SharedAccessKeyName=SOMETHING&SharedAccessKey=VALUE+VALUE=”; preg|u match|u all('/(?:^ | G)(w+)=([^&]+)(?:&|$)/',$str,$matches);
打印(数组合并($matches[1],$matches[2])

如果您想要
urlencode
,您可以使用类似
array_-map(函数($x){return urlencode($x);},$arr)。否则,为什么不干脆用
str\u替换
+
s的空格呢?我不需要
urlencode
,如果我用
+
替换
的空格,如果字符串中也有类似的字符,比如
+
,那么我怎么能找到呢?我对最后一个值的尾随
=/code>感到有点困惑,这应该是值的一部分吗?是@Nick这是我的
SharedAccessKey
key值的一部分,它可以包含任何字符here@BunkerBoy它唯一的限制是键名由字母数字字符或
组成,并且值不能包含
&
。第一个限制可以通过将
(\w+)
替换为
([^=]+)
来轻松匹配除
=
之外的任何内容。
是@Nick我已经测试了你的正则表达式,它对我很有吸引力。谢谢(y)与Nick的答案相同,给出任何其他方式,请格式化你的答案。你必须更清楚你给出的答案。
preg_match_all('/(?:^|\G)(\w+)=([^&]+)(?:&|$)/', $str, $matches);
print_r(array_combine($matches[1], $matches[2]));
Array (
    [HostName] => MyHostName
    [SharedAccessKeyName] => SOMETHING
    [SharedAccessKey] => VALUE+VALUE= 
)