Возникла проблема с parse_str (), заменой + char на пробел - PullRequest
0 голосов
/ 15 марта 2019

У меня есть следующая строка URL:

HostName = MyHostName; SharedAccessKeyName = ТО; SharedAccessKey = ЗНАЧЕНИЕ + значение =

Мне нужно извлечь пару ключ-значение в массиве. Я использовал parse_str() в PHP ниже мой код:

<?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 для этой проблемы, я передал Similiar Question , Отмеченный ответ не является правильным в соответствии с сценарием OP, Это говорит о том, что сначала выполните urlencode(), а затем передайте его, потому что parse_str() сначала декодирует URL, а затем разделяет значения ключа, но при этом возвращается объект массива из одного массива, который возвращает всю строку, как в моем случае, его вывод как:

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

Пожалуйста, помогите мне, не только для + символа, а для всех символов должны быть такими же, как они parse_str()

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вы можете попробовать эмулировать parse_str с preg_match_all:

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

Выход:

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

Демонстрация на 3v4l.org

0 голосов
/ 15 марта 2019

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

...