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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Посмотрите его полный ответ на тесты скорости, а также здесь: fooobar.com/questions/75913/...

Ответ 3

Это дополнение к аргументу 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);

Ответ 4

parse_str($queryString, $vars);
unset($vars['return']);
$queryString = http_build_query($vars);

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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(), чтобы разрешить параметры без значения без ошибок.

Ответ 8

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

Ответ 9

Процедурная реализация Ответ от Марка B's после ответа от Тельшевского.

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' )

Ответ 10

очень просто

$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

Ответ 11

$var = preg_replace( "/return=[^&]+/", "", $var ); 
$var = preg_replace( "/&{2,}/", "&", $var );

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

Ответ 12

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

Подтвердите Mark B шаги. Это полное решение tpow "отменить этот возвращаемый параметр" исходный вопрос - может быть удобно для новичков, пытаясь избежать 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' );

?>

Ответ 13

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 без этого параметра

Ответ 14

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

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

Ответ 15

@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=[^&]+(&|$)/', '$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;
}

возвращает:

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, и моя версия немного меньше.