2012-02-17 82 views
0

假設我有以下的,這是當前網址:PHP:刪除所有,但一個查詢字符串變量

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

我怎麼會刪除除使用PHPS所有參數?換句話說,就是離開:http://myurl.com/locations/?s=bricks其他參數將始終是樣式,類型,特徵和區域,並且其中一些或全部可能存在。

謝謝!

+0

在什麼情況下你想刪除它們?你只是想用另一個替換一個字符串?或者你正在尋找將原始請求重定向到短頭URI?或者它甚至很重要,因爲您無需使用腳本中通過GET傳遞的任何無關參數呢? – rdlowrey 2012-02-17 18:13:39

回答

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

編輯有所安撫喬恩。

+0

現在,這似乎很明顯。謝謝! – 2012-02-17 18:20:04

+0

像我們在國際象棋中說的那樣明顯而可疑。這不適用於除當前網址之外的任何網址,還可能導致格式錯誤的網址,因爲它不會對該值進行urlencode編碼。 – Jon 2012-02-17 18:26:07

+2

如果這是你所需要的,你應該已經指定它是當前的URL,並不意味着它是一個字符串,就像你有以上 – Mike 2012-02-17 18:26:54

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參數中的位置是未知的,那麼你可以這樣做:

$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 2012-02-17 18:16:01

+0

假設's'始終是查詢字符串中的第一個參數。 (只是我的意見,但它不應該假設。) – simshaun 2012-02-17 18:16:47

+0

@rdlowrey現在更新,所以's'可以在任何地方 – 2012-02-17 18:36:22

1

錯誤檢查的方式並不多,但如果s保證存在這將工作:

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

它也將工作無論在什麼位置s出現在查詢字符串。我正在對explode進行一個最小的初始「解析」步驟,但如果感覺不對,您可以隨時帶上大號的槍支並使用parse_url代替,但代價是更加冗長。

+0

我在我的答案去了!不要以爲rawurlencode()在我的情況下是必需的,我說得對嗎? – 2012-02-17 18:23:34

+0

@GuilhermeViebig:如果您希望結果在原始網址也是有效的相同上下文中有效(即您打算將該網址提供給瀏覽器),那麼這是必需的。儘管在很多情況下,瀏覽器和其他軟件會檢測並自動糾正這個錯誤,但這仍然是一個錯誤。 – Jon 2012-02-17 18:27:50

1

您可以通過幾種不同的方式實現此目的。

我會告訴你我所面臨的最好的標準與網址的工作:

$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']; 

祝您好運!

+0

這是完美的,加上你可以操縱你需要的一切 – 2012-02-17 18:28:23

+0

對不起,但這遠非完美。如果你想使用'parse_url',那麼你必須組裝所有可能在那裏的棋子。如果有用戶,密碼或指定的端口怎麼辦?當我在我的回答中寫道「parse_url」需要冗長時,我不是在開玩笑。 :) – Jon 2012-02-17 18:33:20

+0

@Jon如果有用戶/帖子或任何沒有列出的東西,只是再次組裝它的問題,沒有什麼大不了的,還有一些變數。這比使用數組操作快得多。但是,不要對我說,使用PHP標準比爆炸字符串更糟糕。>就像我說的,這是我所面對的最好的標準化方法,這與您的類似,除了parse_url。 – 2012-02-17 18:53:37

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 2012-02-17 18:29:16

+0

你是對的。更新我的回答 – Mike 2012-02-17 18:32:13

+0

@GuilhermeViebig是的。 Jon在3分鐘前提到。 – Mike 2012-02-17 18:33:42

相關問題