Я хочу добавить строку запроса к URL-адресу, однако формат URL непредсказуем. URL может быть
http://example.com/page/
-> http://example.com/page/?myquery=string
http://example.com/page
-> http://example.com/page?myquery=string
http://example.com?p=page
-> http://example.com?p=page&myquery=string
Это URL-адреса, о которых я думаю, но возможно, что есть другие форматы, о которых я не знаю.
Мне интересно, есть ли стандарт, библиотека или общий способ сделать это. Я использую PHP.
Изменить: Я использую объяснения Cbroe и код Passerby . Есть еще одна функция Хамзы, но я думаю, было бы лучше использовать функции PHP, а также иметь более чистый / более короткий код.
function addQuery($url,array $query) { $cache=parse_url($url,PHP_URL_QUERY); if(empty($cache)) return $url."?".http_build_query($query); else return $url."&".http_build_query($query); } // test $test=array("http://example.com/page/","http://example.com/page","http://example.com/?p=page"); print_r(array_map(function($v){ return addQuery($v,array("myquery"=>"string")); },$test));
Демо-версия
Мне интересно, есть ли стандарт, библиотека или общий способ сделать это. Я использую PHP.
Зависит от того, как безотказно – и тем более сложнее – вы хотите, чтобы это было.
Самый простой способ – искать, есть ли ?
в URL – если это так, append &myquery=string
, else append ?myquery=string
. Это должно охватывать большинство случаев совместимых со стандартами URL-адресов.
Если вы хотите, чтобы он был более сложным, вы могли бы разделить URL-адрес, используя parse_url
а затем parse_str
, а затем добавить ключ myquery
со string
значений в массив, возвращаемый второй функцией, а затем снова соединить все вместе, используя http_build_query
для нового запроса строка часть.
Некоторые спагетти Код:
echo addToUrl('http://example.com/page/','myquery', 'string').'<br>'; echo addToUrl('http://example.com/page','myquery', 'string').'<br>'; echo addToUrl('http://example.com/page/wut/?aaa=2','myquery', 'string').'<br>'; echo addToUrl('http://example.com?p=page','myquery', 'string'); function addToUrl($url, $var, $val){ $array = parse_url($url); if(isset($array['query'])){ parse_str($array['query'], $values); } $values[$var] = $val; unset($array['query']); $options = '';$c = count($values) - 1; $i=0; foreach($values as $k => $v){ if($i == $c){ $options .= $k.'='.$v; }else{ $options .= $k.'='.$v.'&'; } $i++; } $return = $array['scheme'].'://'.$array['host'].(isset($array['path']) ? $array['path']: '') . '?' . $options; return $return; }
сecho addToUrl('http://example.com/page/','myquery', 'string').'<br>'; echo addToUrl('http://example.com/page','myquery', 'string').'<br>'; echo addToUrl('http://example.com/page/wut/?aaa=2','myquery', 'string').'<br>'; echo addToUrl('http://example.com?p=page','myquery', 'string'); function addToUrl($url, $var, $val){ $array = parse_url($url); if(isset($array['query'])){ parse_str($array['query'], $values); } $values[$var] = $val; unset($array['query']); $options = '';$c = count($values) - 1; $i=0; foreach($values as $k => $v){ if($i == $c){ $options .= $k.'='.$v; }else{ $options .= $k.'='.$v.'&'; } $i++; } $return = $array['scheme'].'://'.$array['host'].(isset($array['path']) ? $array['path']: '') . '?' . $options; return $return; }
Результаты:
http://example.com/page/?myquery=string http://example.com/page?myquery=string http://example.com/page/wut/?aaa=2&myquery=string http://example.com?p=page&myquery=string
Вы должны попробовать http_build_query()
, я думаю, что это то, что вы ищете, и, возможно, немного parse_str()
.