2012-04-24 178 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); 
}