你好,有人可以帮我这个 我有一个像
这样的网址parent/child/a=1&b=2$c=3
然后我有一个链接,可以为该URL添加变量
<a href="<?php echo $_SERVER["REQUEST_URI"]."&d=test1";?>">LINK 1</a>
<a href="<?php echo $_SERVER["REQUEST_URI"]."&d=test2";?>">LINK 2</a>
每次点击我的链接时,变量d到URL都会像这样继续复制
parent/child/a=1&b=2&c=3&d=test2&d=test2&d=test2&d=test1&d=test1
我知道$ _SERVER [“REQUEST_URI”]继续获取当前的URL,这就是我得到该结果的原因。我已经尝试了$ _SERVER [“”]的一些属性。 我喜欢的是改变d变量值,任何想法如何去做。 任何回复都很受欢迎。谢谢!
答案 0 :(得分:37)
$query = $_GET;
// replace parameter(s)
$query['d'] = 'new_value';
// rebuild url
$query_result = http_build_query($query);
// new link
<a href="<?php echo $_SERVER['PHP_SELF']; ?>?<?php echo $query_result; ?>">Link</a>
答案 1 :(得分:5)
尝试使用以下表达式,它应该工作
preg_replace("#&d=.*&#", '&d=newvalue&', $_SERVER['REQUEST_URI'])
答案 2 :(得分:3)
modify_url_query($url, array('limit' => 50));
我在url中修改查询的功能
function modify_url_query($url, $mod){
$purl = parse_url($url);
$params = array();
if (($query_str=$purl['query']))
{
parse_str($query_str, $params);
foreach($params as $name => $value)
{
if (isset($mod[$name]))
{
$params[$name] = $mod[$name];
unset($mod[$name]);
}
}
}
$params = array_merge($params, $mod);
$ret = "";
if ($purl['scheme'])
{
$ret = $purl['scheme'] . "://";
}
if ($purl['host'])
{
$ret .= $purl['host'];
}
if ($purl['path'])
{
$ret .= $purl['path'];
}
if ($params)
{
$ret .= '?' . http_build_query($params);
}
if ($purl['fragment'])
{
$ret .= "#" . $purl['fragment'];
}
return $ret;
}
答案 3 :(得分:2)
要删除重复添加的查询参数,请执行以下操作
// parse the url
$pathInfo = parse_url($_SERVER['REQUEST_URI']);
$queryString = $pathInfo['query'];
// convert the query parameters to an array
parse_str($queryString, $queryArray);
// add the new query parameter into the array
$queryArray['d'] = 1;
// build the new query string
$newQueryStr = http_build_query($queryArray);
// construct new url
?>
<a href="<?php echo $pathInfo['host'].'?'.$newQueryStr;?>">LINK 1</a>
答案 4 :(得分:0)
这里你没有照顾双引号。用以下代码替换它,然后检查。
<a href="<?php echo 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'].'&d=test1';?>">LINK 1</a>
还要检查firebug每次都在href中的URL。
答案 5 :(得分:0)
function replaceUrlParameters($url = '', $newParams = array()){
if($url){
$urlArray = parse_url($url);
$queryString = $urlArray['query'];
parse_str($queryString, $queryParams);
$queryParams = array_merge($queryParams, $newParams);
$urlArray['query'] = http_build_query($queryParams);
if(!empty($urlArray)){
$url = $urlArray['scheme'].'://'.$urlArray['host'].$urlArray['path'].'?'.$urlArray['query'];
}
}
return $url;
}
// $newParams = array of new parameters or old parameters with new value
$replacedUrl = replaceUrlParameters($url, $newParams);
假设您有以下网址: - <?php echo $_SERVER["REQUEST_URI"]."&a=test1&b=test2";?>
并且您想要将参数b的值替换为test3,那么只需将此网址和具有相同索引的数组传递给新值即可。对于前<?$url = $_SERVER["REQUEST_URI"]."&a=test1&b=test2";?> <? $newParams = ['b' => 'test3']?>
,您将获得 - <? $_SERVER["REQUEST_URI"]."&a=test1&b=test3";?>
答案 6 :(得分:0)
我自己仍然找不到合适的解决方案,所以创建了一个解决方案。
static function changeParameters($url, $parameters)
{
$urlParts = parse_url($url);
$url = "";
if (isset($urlParts['scheme'])) {
$url .= $urlParts['scheme'] . "://";
}
if (isset($urlParts['host'])) {
$url .= $urlParts['host'];
}
if (isset($urlParts['path'])) {
$url .= $urlParts['path'];
}
$query = isset($urlParts['query']) ? $urlParts['query'] : "";
$urlParameters = explode("&", $query);
$urlParameterValuesByKey = new stdClass();
foreach ($urlParameters as $urlParameter) {
$equalsIndex = strrpos($urlParameter, "=");
if ($equalsIndex) {
$urlParameterValuesByKey->{substr($urlParameter, 0, $equalsIndex)} = substr($urlParameter, $equalsIndex + 1);
} else {
$urlParameterValuesByKey->{$urlParameter} = null;
}
}
foreach ($parameters as $key => $value) {
if(!is_string($value)) {
unset($urlParameterValuesByKey->{$key});
} else {
$urlParameterValuesByKey->{$key} = $value;
}
}
$query = "";
foreach ($urlParameterValuesByKey as $key => $value) {
if (strlen($query) === 0) {
$query .= "?";
}
if (strlen($query) > 1) {
$query .= "&";
}
if (is_string($value)) {
$query .= $key . "=" . $value;
} else {
$query .= $key;
}
}
$url .= $query;
return $url;
}
使用stdClass代替关联数组,因为关联数组在设置键之前会对键做一些时髦的事情,如here所述。
答案 7 :(得分:0)
//for absolute path of the page.
$actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
//first delete the param
$url = str_replace('&d='.$_GET["d"], '', $actual_link);
//Now add this param again with it new value
$newUrl=$url.'&d=NewValueHere';
echo '<a href="'.$newUrl.'">Refresh to get new param value</a>';