【问题标题】:Replacing a specific part of a query string PHP替换查询字符串 PHP 的特定部分
【发布时间】:2010-07-22 12:18:15
【问题描述】:

我使用$_SERVER['QUERY_STRING'] 获取查询字符串。

一个例子是a=123&b=456&c=789

如何从查询字符串中删除 b 值以获得 a=123&c=789 其中 b 可以是任何长度的任何值并且是字母数字。

任何想法表示赞赏,谢谢。

【问题讨论】:

  • 如此摇滚,但你不是。因为您接受了一个无法替换多种数据的解决方案。
  • @Col。弹片:解决方案无法替换什么样的数据?然后,OP 可能会对查询参数仅包含数字的情况感兴趣(如示例查询中所报告的);如果是这种情况,建议的解决方案将起作用。
  • @kiamlaluno 很好,如果你把这个网站当作“让我们回答每一个蹩脚的问题然后忘记它”就可以了。但有人认为这个网站是知识的终极来源,答案可以多次使用
  • @pondpad:请参阅我的答案 (stackoverflow.com/questions/3308711#comments-3308749)。
  • @Col。弹片:问题是具体的;我不认为有人可以说这里给出的答复通常是有效的。一般来说,一个问题的答案在其他情况下是无效的;如果在某种情况下解决方案是使用正则表达式,那并不意味着应该始终使用正则表达式。

标签: php regex string


【解决方案1】:

使用url解析的解决方案:

parse_str($_SERVER['QUERY_STRING'], $result_array);
unset($result_array['b']);
$_SERVER['QUERY_STRING'] = http_build_query($result_array);

【讨论】:

  • 肯定是这样的。您也许可以使用现有的$_GET 而不是最初的parse_str()unset($_GET['b']); $qs = http_build_query($_GET);
  • 不同之处在于我的回答只影响$_SERVER['QUERY_STRING'] 变量,并且保持$_GET 不变,以防由于某种原因仍然需要它。
【解决方案2】:

值将是$_GET['b']

怎么样:

str_replace('&b='.$_GET['b'], '', $_SERVER['QUERY_STRING']);

【讨论】:

  • 我喜欢这个。谢谢。
  • 如果值包含需要编码的字符,此解决方案将失败。有关示例,请参见 cmets 中 Shrapnel 上校对我的回答的评论(参见 stackoverflow.com/questions/3308711#comment-3428781)。
  • 啊,是的。但是你可以通过将 $_GET['b'] 包装在一个解码的东西中来解决这个问题。
  • 如果b=之前有一个?怎么办?
【解决方案3】:

试试这个:

$query_new = preg_replace('/(^|&)b=[^&]*/', '', $query);

【讨论】:

  • 投反对票的原因是什么?请不要说“哦,你在使用正则表达式!多么糟糕!”
  • 使用正则表达式将允许替换参数在查询字符串中的任何位置。 str_replace('&b='.$_GET['b'], '', $_SERVER['QUERY_STRING']) 如果它是查询字符串中的第一个参数,则不会替换它。
  • @kiamlaluno:没错。这就是我选择正则表达式搜索的原因。
  • 想象我们有$_GET['b'] = "direct replace sometimes fail";
  • @Gumbo:我认为有时从谁创建问题中显示的代码过于字面意思;参数b 显示在第二位的事实并不意味着它应该始终位于第二位。 OP 要求删除该参​​数,但他并没有说它总是第二个参数,也不是第一个参数。这就是为什么我认为您的答案与其他答案一样有效。如果那时 OP 更喜欢数组而不是字符串,那是 OP 应该报告的内容。
【解决方案4】:

你可以使用这个功能:

function Remove_QS_Key($url, $key) {
$url = preg_replace('/(?:&|(\?))'.$key.'=[^&]*(?(1)&|)?/i', "$1", $url);
return $url;
}

删除任何你想要的键,例如

echo Remove_QS_Key("http://domain.com/?a=b&ref=dusername&c=d&e=f&g=h", "ref");

结果

http://www.domain.com/?a=b&c=d&e=f&g=h

【讨论】:

    【解决方案5】:

    所有答案看起来都不错,但如果你这样做会更灵活:

    // Make a copy of $_GET to keep the original data
    $getCopy = $_GET;
    unset($getCopy['b']); // or whatever var you want to take out
    
    // This is your cleaned array
    var_dump($getCopy);
    
    // If you need the URL-encoded string, just use http_build_query()
    $encodedString = http_build_query($getCopy);
    

    【讨论】:

    • 在 PHP 5.3 中 $getCopy = $_GET 不会创建副本,但会创建对 $_GET 的引用。我在我的代码中遇到了同样的问题,我想保留用于另一个函数的$_GET 的值;我使用了$query = $_GET; unset($query['q'];,结果是另一个函数(直接访问$_GET)也无法检索$_GET['q']
    • 据我所知,要创建引用,您需要执行 $getCopy =& $_GET...
    • @ilarra:没错;在 PHP 5.3 中,只有对象通过引用传递。然后我无法概括我报告的代码,即使用循环替换 $query = $_GET; unset($query['q']; 解决了我的代码中存在的问题。
    【解决方案6】:

    您只需使用$_GET 创建一个变量并在构建过程中排除b 查询字符串:

    $query_string_new = 'a=' . urlencode($_GET['a']) . '&c=' . urlencode($_GET['c']);
    

    $query_string_new 现在应该包含 a=123&c=789

    【讨论】:

    • 别忘了正确转义输出。
    • 如果 ac 不是十进制值怎么办?
    • @Gumbo:你到底是什么意思?,你在这里问或需要建议什么?
    • @sAc:如果你使用urlencode而不是intval,它可以用于任何值。
    【解决方案7】:

    Pear 已经有一个处理 URL 解析/构建的类 (Net_URL2):

    通过 Composer 安装:https://packagist.org/packages/pear/net_url2 安装为包括:https://github.com/pear/Net_URL2/blob/master/Net/URL2.php

    示例代码:

    $url = new Net_URL2('http://www.example.com/?one=1');
    $url->setQueryVariable('two', 2);
    echo $url; // http://www.example.com/?one=1&two=2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 2011-03-04
      相关资源
      最近更新 更多