2012-02-17 53 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

相关问题