【问题标题】:Strip out rest of query string after first ampersand在第一个 & 号之后去掉其余的查询字符串
【发布时间】:2012-04-24 10:31:31
【问题描述】:

我正在尝试从 url 中删除查询字符串,但我需要保持第一个键/变量不变。所以我知道与号的第一次出现是我要丢弃查询字符串的点。最好的方法是什么?下面是我的代码,它目前只是不断附加到查询字符串。

<a href="<?php echo $_SERVER["REQUEST_URI"] ?>&sortkey=year&sortval=asc">

【问题讨论】:

    标签: php regex query-string


    【解决方案1】:

    您可以简单地匹配所有不是 & 符号的东西,直到我们找到第一个 & 符号。例如

    $incomingURI = 'http://www.example.com/?id=12&left=right&up=down';
    preg_match('/[^&]+/', $incomingURI, $match);
    $outgoingURI = $match[0];
    

    上面的代码会在变量$outgoingURI中输出以下内容:

    http://www.example.com/?id=12
    

    这将比使用 preg_replace 快得多。

    【讨论】:

    • 这应该是公认的答案。但是你在正则表达式中有一个额外的+
    • @rvighne 额外的+ 不是错字。在 PHP 中使用的 PCRE 中,附加的 + 使表达式具有所有格。如果没有找到 & 符号,它将不会回溯再次查看。现在回头看这段代码,速度的提高实际上是不存在的,因为我们只寻找 1 个字符,它是一个小字符串,但双加语法很好。
    【解决方案2】:

    如果我正确理解了您的问题,您想在第一次出现 & 符号后删除所有内容。你可以使用这样的东西:

    <?php
    $uri = 'blah.blah.com?a=b&sortkey=year&sortval=asc';
    $new_uri = preg_replace("/([^&]+)&(.*)/", "$1", $uri)
    ?>
    

    图案:

    ([^&]+) : Match everything except '&'
    &       : First '&'
    (.*)    : Any thing after that
    

    被第一组 ($1) 替换,这是在第一次出现 &amp; 之前的任何内容。

    【讨论】:

      【解决方案3】:

      使用strpos 函数查找与符号的位置。然后使用 substr 函数获取 URL 的部分直到该点。

      【讨论】:

        【解决方案4】:

        strpos 可以,但除非您使用 RewriteRule,否则 $_SERVER['SCRIPT_NAME'] 或 $_SERVER['PHP_SELF'] 就足够了(而且可能更有效)。

        如果正在重写 URL,则 $_SERVER['REDIRECT_URL'] 更合适。

        编辑:我错过了保留查询字符串第一部分的内容:s

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-18
          • 2012-10-23
          • 2011-03-06
          • 1970-01-01
          • 2021-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多