【问题标题】:How to get and change URL variable PHP如何获取和更改 URL 变量 PHP
【发布时间】:2013-04-08 20:12:40
【问题描述】:

嗨,谁能帮我解决这个问题 我有一个类似的网址

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 变量值,知道怎么做。 任何回复都非常感谢。谢谢!

【问题讨论】:

  • 如果 d= 存在,则在 $_SERVER["REQUEST_URI"] 上使用 preg_replace
  • @Robert Podwika。我认为 preg_replace 可以,但我不知道如何使用该代码,现在我将在 PHP 手册中学习。谢谢。如果代码解决了我的问题,我会点击 +1。谢谢罗伯特!
  • @kodewrecker:你看过我的回答了吗?它应该工作
  • 应该将$c=3 改为&amp;c=3,对吗?

标签: php html hyperlink


【解决方案1】:
//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>';

【讨论】:

    【解决方案2】:

    自己还是找不到合适的解决方案,所以创建了一个..

    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 所述。

    【讨论】:

      【解决方案3】:

      要删除重复添加的查询参数,请执行以下操作

      // 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>
      

      【讨论】:

      • @CaffeineShots 它应该是 parse_str($queryString, $queryArray);而不是 $queryArray = parse_str($queryString);然后 $data 是 $queryArray
      【解决方案4】:
      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);
      

      假设您有类似 :- &lt;?php echo $_SERVER["REQUEST_URI"]."&amp;a=test1&amp;b=test2";?&gt; 的 url,并且您想将参数 b 的值替换为 test3,然后只需将该 url 和具有相同索引的数组传递给新值。对于前 - &lt;?$url = $_SERVER["REQUEST_URI"]."&amp;a=test1&amp;b=test2";?&gt; &lt;? $newParams = ['b' =&gt; 'test3']?&gt; 那么你会得到 - &lt;? $_SERVER["REQUEST_URI"]."&amp;a=test1&amp;b=test3";?&gt;

      【讨论】:

      • 请考虑解释一下这段代码 sn-p 的作用,以及如何使用它。这如何解决原问题中的问题?
      • 编辑了我的答案。
      【解决方案5】:
      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;
      
      }
      

      【讨论】:

      • 它工作正常但出现未定义的错误,如何解决?
      【解决方案6】:
      $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>
      

      【讨论】:

      • 这是一个更好的答案,我一直在寻找这样的东西。谢谢。
      • 到目前为止,我见过的最优雅的解决方案是针对几个类似问题发布的
      【解决方案7】:

      试试下面的表达式,它应该可以工作

      preg_replace("#&d=.*&#", '&d=newvalue&', $_SERVER['REQUEST_URI'])
      

      【讨论】:

      • 是的,我现在正在测试它。第一个参数是什么? “#&d=.*”是数字符号(#),星号(*)是必要的吗?请问这是干什么用的?
      • 这些是表达式语法。 '&d=.*&' 这就是我们想要的。它将用您作为第二个参数提供的内容替换内容 &d=*&。我已经更新了代码,请用新代码再次检查。
      • 请注意任何找到此答案并尝试它的人。如果您希望更改的变量是第一个变量,因为前面缺少“&”符号,这将不起作用。
      【解决方案8】:

      这里你没有处理双引号。将其替换为以下代码,然后检查。

      <a href="<?php echo 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'].'&d=test1';?>">LINK 1</a>
      

      并且还要在 firebug 中检查每次在 href 中的 URL 是什么。

      【讨论】:

      • 我认为这不会有什么不同吗?
      • @OSSCube。我试过了,最后双引号和单引号都很好,但是我改变它只是为了测试你的,仍然复制变量 d 先生,但还是感谢您的回复。
      猜你喜欢
      • 2023-04-08
      • 2021-04-11
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 2012-07-27
      • 2013-03-04
      • 1970-01-01
      相关资源
      最近更新 更多