2012-02-17 2 views
0

Предположим, у меня есть следующий, который является текущим URL:PHP: Удалить все, кроме строковых переменных один запроса

http://myurl.com/locations/?s=bricks&style=funky-quirky+rustic&feature=floors-concrete+kitchen+bathroom 

Как бы удалить все параметры кромеS с помощью PHP? Другими словами, просто оставить: http://myurl.com/locations/?s=bricks Другими параметрами всегда будут стиль, тип, функция и область, и некоторые или все из них могут присутствовать.

Спасибо!

+0

В каком контексте вы хотите удалить их? Вы просто пытаетесь заменить одну строку на другую? Или вы хотите перенаправить запрос на оригинал в URI сокращенного времени? Или это даже важно, потому что вы не обязаны использовать какие-либо посторонние параметры, переданные через GET в вашем скрипте? – rdlowrey

ответ

1
if (isset($_GET['s']) && count($_GET) > 1) { 
    header('Location: ?s='. rawurlencode($_GET['s'])); 
    exit; 
} 

Edited в некоторой степени успокоить Джона.

+0

сейчас, что кажется очевидным. Благодаря! –

+0

Очевидный, но сомнительный, как мы говорим в шахматах. Это не будет работать с каким-либо другим URL-адресом, кроме текущего, и это также может привести к неверному URL-адресу, поскольку он не присвоит значение. – Jon

+2

Если это то, что вам нужно, вы должны были указать, что это был текущий URL-адрес, а не подразумевая, что это строка, как у вас выше – Mike

1

Если вы знаете, что s всегда будет первым параметром, то вы можете просто сделать:

$url = "http://myurl.com/locations/?s=bricks&style=funky-quirky+rustic&feature=floors-concrete+kitchen+bathroom"; 
$split = explode('&',$url); 
echo $split[0]; 

Однако, если положение s в параметрах является Unkown, то вы можете сделать это:

$url = "http://myurl.com/locations/?s=bricks&style=funky-quirky+rustic&feature=floors-concrete+kitchen+bathroom"; 
$split = explode('?',$url); 
parse_str($split[1],$params); 
echo $split[0].'?s='.$params['s']; 
+1

Что делать, если 's' не является первым параметром, переданным через GET? Порядок не имеет значения, когда используются переменные GET, поэтому это не очень устойчиво ... – rdlowrey

+0

Предполагается, что 's' всегда является первым параметром в строке запроса. (Только мое мнение, но это не должно допускать этого.) – simshaun

+0

@rdlowrey обновлено сейчас, поэтому 's' может быть где угодно –

1

Не так много на пути проверки ошибок, но если s гарантированно существует, это будет работать:

list($base, $query) = explode('?', $url); 
parse_str($query, $vars); 
$result = $base.'?s='.rawurlencode($vars['s']); 

Он также будет работать независимо от того, в каком положении s появляется в строке запроса. Я делаю минимальный начальный «синтаксический» шаг с explode, но если это не так, вы всегда можете принести большие пушки и пойти с parse_url вместо того, чтобы быть намного более подробным.

+0

. Я пошел за этим в свой ответ! Не думаю, что rawurlencode() требуется в моем случае, я прав? –

+0

@GuilhermeViebig: Это необходимо, если вы хотите, чтобы результат был действительным в тех же контекстах, где исходный URL-адрес также был бы действительным (т. Е. Если вы намереваетесь предоставить этот URL-адрес браузеру). Хотя во многих случаях браузеры и другое программное обеспечение обнаруживают и автоматически исправляют эту ошибку, это все еще ошибка. – Jon

1

Вы можете достичь этого несколькими способами.

Я покажу вам самый лучший стандарт, я когда-либо сталкиваются работать с URLs:

$originUrl = parse_url('http://myurl.com/locations/?s=bricks&style=funky-quirky+rustic&feature=floors-concrete+kitchen+bathroom'); 
parse_str($originUrl['query'], $queryString); 
echo $newUrl = $originUrl['scheme'].'://'.$originUrl['host'].$originUrl['path'].'?s='.$queryString['s']; 

Good Luck!

+0

это безупречно, и плюс вы можете манипулировать всем остальным, что вам нужно –

+0

Извините, но это далеко не безупречно. Если вы хотите использовать 'parse_url', вам нужно собрать все * все * части, которые, возможно, были там. Что делать, если есть пользователь, пароль или порт? Когда я написал в своем ответе, что 'parse_url' должен быть подробным, я не шутил. :) – Jon

+0

@Jon Если есть пользователь/сообщение или что-то, что не указано, это просто вопрос его сборки, неважно, еще несколько переменных. Это намного быстрее, чем использование манипуляций с массивами. Но, не говорите мне, что использование стандарта PHP хуже, чем взорвать строки:> Как я уже сказал, это лучший стандартизованный метод, с которым я столкнулся, это похоже на ваш, кроме как из parse_url. –

1
parse_str(parse_url($url, PHP_URL_QUERY), $query); 
$newurl = 'http://myurl.com/locations/?s=' . $query['s']; 
+1

В PHP нет функции 'parse_string', а [' parse_str'] (http://php.net/manual/en/function.parse-str.php) (которую вы, конечно же, предназначили), не работает так как он не возвращает результат анализа. – Jon

+0

Вы правы. Обновлен мой ответ – Mike

+0

@GuilhermeViebig Да. Джон упомянул об этом 3 минуты назад. – Mike

Смежные вопросы