Удалить параметр URL с помощью PHP
У меня есть некоторые ссылки в презентации powerpoint, и по какой-то причине, когда эти ссылки нажимаются, он добавляет возвращаемый параметр в URL. Ну, этот возвращаемый параметр вызывает сбой шаблона MVC моего сайта Joomla.
Итак, каков эффективный способ удалить этот возвращаемый параметр с помощью PHP...?
пример: http://mydomain.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0
15 ответов
самый безопасный" правильный " метод будет:
- проанализируйте url-адрес в массив с помощью
parse_url()
- извлеките часть запроса, разложите ее на массив с помощью
parse_str()
- удалить параметры запроса с помощью
unset()
их из массива - перестроить исходный url-адрес с помощью
http_build_query()
быстрый и грязный, чтобы использовать строку поиска / замены и / или регулярное выражение, чтобы убить от стоимости.
в другом потоке Джастин предполагает, что самый быстрый способ-использовать strtok ()
$url = strtok($url, '?');
см. его полный ответ с тестами скорости также здесь:https://stackoverflow.com/a/1251650/452515
это дополнение Марка Бответ с примером, хотя он может выглядеть довольно долго, это безопасный способ удалить параметр. В этом примере мы удаляем 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);
parse_str($queryString, $vars);
unset($vars['return']);
$queryString = http_build_query($vars);
parse_str
анализирует строку запроса,http_build_query
создает строку запроса.
вот фактический код для того, что описано выше как "самый безопасный"правильный " метод"...
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()
чтобы избежать двойного кодирования .
Примечание: обновлено с ksort()
разрешить параметры без значения без ошибки.
function removeParam($url, $param) {
$url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*$/', '', $url);
$url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*&/', '', $url);
return $url;
}
Это один из многих способов, не проверял, но должно работать.
$link = 'http://mydomain.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0';
$linkParts = explode('&return=', $link);
$link = $linkParts[0];
процессуальное оформление марка Б ответ после переработки Сергей Telshevsky это!--3--> ответ.
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
Вау, здесь много примеров. Я предоставляю тот, который делает некоторую обработку ошибок. Он перестраивает и возвращает весь URL-адрес с помощью строки запроса-param-to-be-removed, removed. Он также предоставляет бонусную функцию, которая строит текущий URL-адрес на лету. Проверено, работает!
кредит Марк Б для действий. Это полное решение для tpow"s" strip off this return parameter " original question -- может быть удобно для начинающих, пытающихся избегайте PHP gotchas. :-)
<?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' );
?>
$var = preg_replace( "/return=[^&]+/", "", $var ); $var = preg_replace( "/&{2,}/", "&", $var );
вторая строка просто заменит & & to&
@MarcB упомянул, что грязно использовать regex для удаления параметра 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=[^&]+(&|$)/', '', $url) . PHP_EOL;
}
echo PHP_EOL . '@kraftb' . PHP_EOL;
foreach ($urls as $url) {
echo preg_replace('/(&|\?)foo=[^&]*&/', '', 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;
}
возвращает:
Original 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 My version example.com/ example.com/?bar=foo example.com/?bar=foo
Как вы можете видеть, только @kraftb опубликовал правильный ответ с помощью regex, и моя версия немного меньше.
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-адреса. Измените " я " на все, что вам нужно.