当我们向网址
添加一个参数时$ redirectURL = $ printPageURL。 “?模式= 1”;
如果$ printPageURL为“http://www.somesite.com/print.php”,则可以正常工作,但如果$ printPageURL在全局文件中更改为“http://www.somesite.com/print.php?newUser=1”,则URL将变得非常糟糕。如果项目有300个文件,并且有30个文件以这种方式附加param,我们需要更改所有30个文件。
如果我们使用“& mode = 1”并且$ printPageURL从“http://www.somesite.com/print.php?new=1”更改为“http://www.somesite.com/print.php”,则相同,那么网址也会形成错误。
PHP中是否有一个库会自动处理“?”和“&”,甚至检查现有的param是否已经存在并删除了那个,因为它将被后者替换,如果URL继续增长则不好?
更新:的几个有用的答案,似乎没有预先存在的函数addParam($ url,$ newParam),所以我们不需要写它?
答案 0 :(得分:9)
使用parse_url()
组合来展开网址,parse_str()
分解查询字符串,http_build_query()
重新构建查询字符串。之后,您可以从parse_url()
获得的原始片段和使用http_build_query()
构建的新查询字符串重建整个网址。随着查询字符串被分解为关联数组(键值对),修改查询就像在PHP中修改数组一样简单。
修改强>
$query = parse_url('http://www.somesite.com/print.php?mode=1&newUser=1', PHP_URL_QUERY);
// $query = "mode=1&newUser=1"
$params = array();
parse_str($query, $params);
/*
* $params = array(
* 'mode' => '1'
* 'newUser' => '1'
* )
*/
unset($params['newUser']);
$params['mode'] = 2;
$params['done'] = 1;
$query = http_build_query($params);
// $query = "mode=2&done=1"
答案 1 :(得分:3)
答案 2 :(得分:2)
http://www.addedbytes.com/php/querystring-functions/ 是一个开始的好地方
编辑:还有http://www.php.net/manual/en/class.httpquerystring.php
例如:
$http = new HttpQueryString();
$http->set(array('page' => 1, 'sort' => 'asc'));
$url = "yourfile.php" . $http->toString();
答案 3 :(得分:1)
当网址为以下格式时,这些解决方案都不起作用: xyz.co.uk?param1=2&replace_this_param=2 param1一直被丢弃 ..这意味着它永远不会工作!
如果你看一下上面给出的代码:
function addParam($url, $s) {
return adjustParam($url, $s);
}
function delParam($url, $s) {
return adjustParam($url, $s);
}
这些功能是IDENTICAL - 那么如何添加和删除?!
答案 4 :(得分:0)
使用WishCow和sgehrig的建议,这是一个测试:
(假设没有网址的锚点)
<?php
echo "<pre>\n";
function adjustParam($url, $s) {
if (preg_match('/(.*?)\?/', $url, $matches)) $urlWithoutParams = $matches[1];
else $urlWithoutParams = $url;
parse_str(parse_url($url, PHP_URL_QUERY), $params);
if (strpos($s, '=') !== false) {
list($var, $value) = split('=', $s);
$params[$var] = urldecode($value);
return $urlWithoutParams . '?' . http_build_query($params);
} else {
unset($params[$s]);
$newQueryString = http_build_query($params);
if ($newQueryString) return $urlWithoutParams . '?' . $newQueryString;
else return $urlWithoutParams;
}
}
function addParam($url, $s) {
return adjustParam($url, $s);
}
function delParam($url, $s) {
return adjustParam($url, $s);
}
echo "trying add:\n";
echo addParam("http://www.somesite.com/print.php", "mode=3"), "\n";
echo addParam("http://www.somesite.com/print.php?", "mode=3"), "\n";
echo addParam("http://www.somesite.com/print.php?newUser=1", "mode=3"), "\n";
echo addParam("http://www.somesite.com/print.php?newUser=1&fee=0", "mode=3"), "\n";
echo addParam("http://www.somesite.com/print.php?newUser=1&fee=0&", "mode=3"), "\n";
echo addParam("http://www.somesite.com/print.php?mode=1", "mode=3"), "\n";
echo "\n", "now trying delete:\n";
echo delParam("http://www.somesite.com/print.php?mode=1", "mode"), "\n";
echo delParam("http://www.somesite.com/print.php?mode=1&newUser=1", "mode"), "\n";
echo delParam("http://www.somesite.com/print.php?mode=1&newUser=1", "newUser"), "\n";
?>
,输出为:
trying add:
http://www.somesite.com/print.php?mode=3
http://www.somesite.com/print.php?mode=3
http://www.somesite.com/print.php?newUser=1&mode=3
http://www.somesite.com/print.php?newUser=1&fee=0&mode=3
http://www.somesite.com/print.php?newUser=1&fee=0&mode=3
http://www.somesite.com/print.php?mode=3
now trying delete:
http://www.somesite.com/print.php
http://www.somesite.com/print.php?newUser=1
http://www.somesite.com/print.php?mode=1
答案 5 :(得分:0)
你可以试试这个:
function removeParamFromUrl($query, $paramToRemove)
{
$params = parse_url($query);
if(isset($params['query']))
{
$queryParams = array();
parse_str($params['query'], $queryParams);
if(isset($queryParams[$paramToRemove])) unset($queryParams[$paramToRemove]);
$params['query'] = http_build_query($queryParams);
}
$ret = $params['scheme'].'://'.$params['host'].$params['path'];
if(isset($params['query']) && $params['query'] != '' ) $ret .= '?'.$params['query'];
return $ret;
}