2012-04-24 29 views
0

所以我試圖從預定義在數組中的URL查詢字符串中刪除特定的參數。這是我到目前爲止有:使用PHP從URL中刪除特定的參數

<?php 
// Construct the current page URL 
$host  = $_SERVER['HTTP_HOST']; 
$script = $_SERVER['SCRIPT_NAME']; 
$params = $_SERVER['QUERY_STRING']; 
$currentUrl = 'http://' . $host . $script . '?' . $params; 

// Store all URL parameters into an array (HOST, PATH, QUERY, etc) 
$url_params = array(); 
$url_params = parse_url($currentUrl); 

// Create an array to store just the query string, breaking them apart 
$params_array = explode('&', $url_params['query']); 

// Array holding URL parameters that we want to remove 
$params_to_remove = array("param1", "param2", "param3", "param4", "param5"); 


$location = 0; 
// Loop through and remove parameters found in PARAMS_TO_REMOVE array 
for($x = 0; $x < count($params_to_remove); $x++) { 
    if(in_array($params_to_remove[$x], $params_array)) { 
     $location = array_search($params_to_remove[$x], $params_array); 
     unset($params_array[$location]); 
    } 
} 

// Print array after unwanted parameters were removed 
print_r($params_array); 
echo '<br /><br />'; 

// Construct a new array holding only the parameters that we want 
$clean_params_array = array(); 
for($z = 0; $z < count($params_array); $z++) { 
    if($params_array[$z] != '') array_push($clean_params_array, $params_array[$z]); 
} 

// Print clean array 
print_r($clean_params_array); 
echo '<br />'; 

// Construct the new URL 
// If there are paramters remaining in URL reconstruct them 
if(count($clean_params_array) > 0) { 
    $final_url = 'http://www.example.com' . $url_params['path'] . '?'; 
    for($y = 0; $y < count($clean_params_array); $y++) { 
     $final_url .= $clean_params_array[$y] . '&'; 
    } 
    // Trim off the final ampersand 
    $final_url = substr($final_url, 0, -1); 
} 
// No parameters in final URL 
else $final_url = 'http://www.example.com' . $url_params['path']; 

// Print final URL 
echo '<br />' . $final_url; 
?> 

下面是輸出:

使用http://www.example.com/test.php?apple&banana&orange&param1&strawberry&param2&pineapple

Array ([0] => apple [1] => banana [2] => orange [4] => strawberry [6] => pineapple) 

Array ([0] => apple [1] => banana [2] => orange [3] => strawberry) 

http://www.example.com/test.php?apple&banana&orange&strawberry 

正如你可以看到我失去了最後一個參數。我也覺得自己太冗長了......我哪裏錯了?

+2

你爲什麼不使用['http_build_query()'](http://php.net/manual/function.http -build-query.php)用於構建URL? – ComFreek 2012-04-24 20:12:02

+0

那麼這並不能真正回答我的問題... – 2012-04-24 20:28:33

+2

因此,我只創建了一條評論,它只是一個附註;) – ComFreek 2012-04-24 20:29:57

回答

3
$new_url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']."?".implode("&",array_diff(explode("&",$_SERVER['QUERY_STRING']),Array("param1","param2","param3","param4","param5"))); 

的單行;)

雖然你可能會更好採取這一Array(...)離開那裏,並定義它作爲一個變量事前,所以它更容易閱讀。

+1

好的解決方案,但我討厭複雜的1襯裏像那樣。我寧願有3/4行易於遵循的代碼。所以-1,對不起。 – vascowhite 2012-04-24 20:25:01

+0

如果只有我以前見過array_diff函數( – 2012-04-24 20:27:53

2
<?php 
/** 
    * generateURL() 
    * 
    * Sprava URL adresy 
    * 
    * @author stenley <[email protected]> 
    * @version 1.4 
    */ 

function generateURL() { 
    $GET = $_GET; 
    $QUERY_STRING = ''; 
    $SCRIPT_NAME = substr(strrchr($_SERVER["SCRIPT_NAME"],"/"),1); 

    $num_args = func_num_args(); 
    if($num_args>0 && $num_args%2==0) { 
     $args = func_get_args(); 

     foreach($args as $index => $paramName) { 
      $paramName = trim($paramName); 

      if($index%2==0 && !empty($paramName)) { 
      $paramValue = trim($args[$index+1]); 

      if(array_key_exists($paramName, $GET) && empty($paramValue)) { 
       unset($GET[$paramName]);  
      } elseif(!empty($paramValue)) { 
       $GET[$paramName] = $paramValue; 
      } 
      } 
     } 
    } 

    foreach($GET as $param => $value) { 
     $QUERY_STRING .= $param."=".$value."&amp;"; 
    } 

    return $SCRIPT_NAME.((empty($QUERY_STRING)) ? '' : "?".substr($QUERY_STRING,0,-5)); 
} 
?> 

這裏有很好的管理URL地址的功能。用法很簡單。 here are some examples在斯洛伐克語。但我認爲你會理解代碼示例。或者我會翻譯爲你

對不起,我的英語

1

部分的答案是在這一行: 陣列([0] =>蘋果[1] =>香蕉[2] => orange [4] => strawberry [6] =>菠蘿)

請注意$ params_array [5]不存在。然而,你試圖讀取$ params_array [5]當$ Z^== 5 (在while循環你通過價值$ Z = 0 => $ Z^< 6;(計數($ params_array))

你可以使用Kolink的解決方案,或使用foreach循環來遍歷所有的值:

foreach($params_array as $param) { 
    if($param != '') array_push($clean_params_array, $param); 
}