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