Добавление строки запроса к случайному URL-адресу

Я хочу добавить строку запроса к 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, а также иметь более чистый / более короткий код.

Related of "Добавление строки запроса к случайному URL-адресу"

 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() .