Сбросить параметр URL с помощью PHP

У меня есть некоторые ссылки в презентации PowerPoint, и по какой-то причине, когда эти ссылки получают щелчок, он добавляет возвращаемый параметр в URL. Ну, этот параметр return приводит к тому, что мой шаблон MVC на сайте Joomla становится испорченным.

Итак, какой эффективный способ снять этот возвращаемый параметр с помощью PHP …?

Пример: http://mydomain.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0

Related of "Сбросить параметр URL с помощью PHP"

Самый безопасный «правильный» метод:

  1. Разбирайте url в массив с parse_url()
  2. Извлеките часть запроса, разложите ее в массив, используя parse_str()
  3. Удалите требуемые параметры запроса unset() из массива
  4. Перестройте исходный URL-адрес, используя http_build_query()

Быстро и грязно использовать строку поиска / замены и / или регулярное выражение, чтобы убить значение.

В другой теме Джастин предполагает, что самым быстрым способом является использование strtok ()

  $url = strtok($url, '?'); 

Посмотрите его полный ответ на тесты скорости, а также здесь: https://stackoverflow.com/a/1251650/452515

Это в дополнение к ответу Marc B на примере, хотя может показаться довольно длинным, это безопасный способ удаления параметра. В этом примере мы удаляем page_number

 <?php $x = 'http://url.com/search/?location=london&page_number=1'; $parsed = parse_url($x); $query = $parsed['query']; parse_str($query, $params); unset($params['page_number']); $string = http_build_query($params); var_dump($string); не <?php $x = 'http://url.com/search/?location=london&page_number=1'; $parsed = parse_url($x); $query = $parsed['query']; parse_str($query, $params); unset($params['page_number']); $string = http_build_query($params); var_dump($string); 
 parse_str($queryString, $vars); unset($vars['return']); $queryString = http_build_query($vars); не parse_str($queryString, $vars); unset($vars['return']); $queryString = http_build_query($vars); 

parse_str анализирует строку запроса, http_build_query создает строку запроса.

Вы можете сделать preg_replace как:

 $new_url = preg_replace('/&?return=[^&]*/', '', $old_url); 

Это один из многих способов, не проверенный, но должен работать.

 $link = 'http://mydomain.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0'; $linkParts = explode('&return=', $link); $link = $linkParts[0]; 

Вот фактический код для того, что описано выше, как «самый безопасный« правильный »метод» …

 function reduce_query($uri = '') { $kill_params = array('gclid'); $uri_array = parse_url($uri); if (isset($uri_array['query'])) { // Do the chopping. $params = array(); foreach (explode('&', $uri_array['query']) as $param) { $item = explode('=', $param); if (!in_array($item[0], $kill_params)) { $params[$item[0]] = isset($item[1]) ? $item[1] : ''; } } // Sort the parameter array to maximize cache hits. ksort($params); // Build new URL (no hosts, domains, or fragments involved). $new_uri = ''; if ($uri_array['path']) { $new_uri = $uri_array['path']; } if (count($params) > 0) { // Wish there was a more elegant option. $new_uri .= '?' . urldecode(http_build_query($params)); } return $new_uri; } return $uri; } $_SERVER['REQUEST_URI'] = reduce_query($_SERVER['REQUEST_URI']); 

Однако, поскольку это, вероятно, будет существовать до загрузки вашего приложения, вы должны, вероятно, включить его в анонимную функцию. Как это…

 call_user_func(function($uri) { $kill_params = array('gclid'); $uri_array = parse_url($uri); if (isset($uri_array['query'])) { // Do the chopping. $params = array(); foreach (explode('&', $uri_array['query']) as $param) { $item = explode('=', $param); if (!in_array($item[0], $kill_params)) { $params[$item[0]] = isset($item[1]) ? $item[1] : ''; } } // Sort the parameter array to maximize cache hits. ksort($params); // Build new URL (no hosts, domains, or fragments involved). $new_uri = ''; if ($uri_array['path']) { $new_uri = $uri_array['path']; } if (count($params) > 0) { // Wish there was a more elegant option. $new_uri .= '?' . urldecode(http_build_query($params)); } // Update server variable. $_SERVER['REQUEST_URI'] = $new_uri; } }, $_SERVER['REQUEST_URI']); 

ПРИМЕЧАНИЕ. Обновлено с помощью urldecode() чтобы избежать двойного кодирования с via http_build_query() . ПРИМЕЧАНИЕ. Обновлено с помощью ksort() чтобы разрешить параметры без значения без ошибки.

 function removeParam($url, $param) { $url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*$/', '', $url); $url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*&/', '$1', $url); return $url; } 

Процедурная реализация ответа Марка Б после уточнения ответа Сергея Тельшевского .

 function strip_param_from_url( $url, $param ) { $base_url = strtok($url, '?'); // Get the base url $parsed_url = parse_url($url); // Parse it $query = $parsed_url['query']; // Get the query string parse_str( $query, $parameters ); // Convert Parameters into array unset( $parameters[$param] ); // Delete the one you want $new_query = http_build_query($parameters); // Rebuilt query string return $base_url.'?'.$new_query; // Finally url is ready } // Usage echo strip_param_from_url( 'http://url.com/search/?location=london&page_number=1', 'location' ) 

очень просто

 $link = "http://example.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0" echo substr($link, 0, strpos($link, "return") - 1); //output : http://example.com/index.php?id=115&Itemid=283 
 $ var = preg_replace ("/ return = [^ &] + /", "", $ var); 
 $ var = preg_replace ("/ & {2,} /", "&", $ var);

Вторая строка просто заменит && на &

Вау, здесь есть много примеров. Я предоставляю тот, который выполняет некоторую обработку ошибок. Он перестраивает и возвращает весь URL-адрес с удалением строки-запроса-строки-удаления. Он также предоставляет бонусную функцию, которая строит текущий URL на лету. Протестировано, работает!

Подпишитесь на Марка Б за шаги. Это полное решение для «отменить этот возвращаемый параметр tpow » с исходным вопросом – может быть удобно для новичков, пытаясь избежать ошибок PHP. 🙂

 <?php function currenturl_without_queryparam( $queryparamkey ) { $current_url = current_url(); $parsed_url = parse_url( $current_url ); if( array_key_exists( 'query', $parsed_url )) { $query_portion = $parsed_url['query']; } else { return $current_url; } parse_str( $query_portion, $query_array ); if( array_key_exists( $queryparamkey , $query_array ) ) { unset( $query_array[$queryparamkey] ); $q = ( count( $query_array ) === 0 ) ? '' : '?'; return $parsed_url['scheme'] . '://' . $parsed_url['host'] . $parsed_url['path'] . $q . http_build_query( $query_array ); } else { return $current_url; } } function current_url() { $current_url = 'http' . (isset($_SERVER['HTTPS']) ? 's' : '') . '://' . "{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"; return $current_url; } echo currenturl_without_queryparam( 'key' ); ?> 
 function remove_attribute($url,$attribute) { $url=explode('?',$url); $new_parameters=false; if(isset($url[1])) { $params=explode('&',$url[1]); $new_parameters=ra($params,$attribute); } $construct_parameters=($new_parameters && $new_parameters!='' ) ? ('?'.$new_parameters):''; return $new_url=$url[0].$construct_parameters; } function ra($params,$attr) { $attr=$attr.'='; $new_params=array(); for($i=0;$i<count($params);$i++) { $pos=strpos($params[$i],$attr); if($pos===false) $new_params[]=$params[$i]; } if(count($new_params)>0) return implode('&',$new_params); else return false; } 

// просто скопируем приведенный выше код и просто вызываем эту функцию следующим образом, чтобы получить новый url без определенного параметра

echo remove_attribute ($ url, 'delete_params'); // дает новый url без этого параметра

 <? if(isset($_GET['i'])){unset($_GET['i']); header('location:/');} ?> 

Это приведет к удалению параметра «i» из URL-адреса. Измените «i» на все, что вам нужно.

@MarcB упомянул, что грязно использовать регулярное выражение для удаления параметра url. И да, потому что это не так просто, как кажется:

 $urls = array( 'example.com/?foo=bar', 'example.com/?bar=foo&foo=bar', 'example.com/?foo=bar&bar=foo', ); echo 'Original' . PHP_EOL; foreach ($urls as $url) { echo $url . PHP_EOL; } echo PHP_EOL . '@AaronHathaway' . PHP_EOL; foreach ($urls as $url) { echo preg_replace('#&?foo=[^&]*#', null, $url) . PHP_EOL; } echo PHP_EOL . '@SergeS' . PHP_EOL; foreach ($urls as $url) { echo preg_replace( "/&{2,}/", "&", preg_replace( "/foo=[^&]+/", "", $url)) . PHP_EOL; } echo PHP_EOL . '@Justin' . PHP_EOL; foreach ($urls as $url) { echo preg_replace('/([?&])foo=[^&]+(&|$)/', '$1', $url) . PHP_EOL; } echo PHP_EOL . '@kraftb' . PHP_EOL; foreach ($urls as $url) { echo preg_replace('/(&|\?)foo=[^&]*&/', '$1', preg_replace('/(&|\?)foo=[^&]*$/', '', $url)) . PHP_EOL; } echo PHP_EOL . 'My version' . PHP_EOL; foreach ($urls as $url) { echo str_replace('/&', '/?', preg_replace('#[&?]foo=[^&]*#', null, $url)) . PHP_EOL; } 

возвращает:

 оригинал
 example.com/?foo=bar
 example.com/?bar=foo&foo=bar
 example.com/?foo=bar&bar=foo

 @AaronHathaway
 example.com/?
 example.com/?bar=foo
 example.com/?&bar=foo

 @SergeS
 example.com/?
 example.com/?bar=foo&
 example.com/?&bar=foo

 @Justin
 example.com/?
 example.com/?bar=foo&
 example.com/?bar=foo

 @kraftb
 example.com/
 example.com/?bar=foo
 example.com/?bar=foo

 Моя версия
 example.com/
 example.com/?bar=foo
 example.com/?bar=foo

Как вы можете видеть, только @kraftb отправил правильный ответ с помощью regex, и моя версия немного меньше.