删除php中的一部分URL参数字符串

时间:2010-09-26 20:06:36

标签: php string

我在PHP中有一个字符串,它是一个包含所有参数的URI:

$string = http://domain.com/php/doc.php?arg1=0&arg2=1&arg3=0

我想完全删除一个参数并返回保留字符串。例如,我想删除arg3并最终获得:

$string = http://domain.com/php/doc.php?arg1=0&arg2=1

我总是希望删除相同的参数(arg3),它可能是也可能不是最后一个参数。

思想?

编辑:arg3中可能有一堆奇怪的角色,所以我最喜欢这样做的方式(实质上)是:

$newstring = remove $_GET["arg3"] from $string;

4 个答案:

答案 0 :(得分:8)

这里没有真正的理由使用正则表达式,你可以使用字符串和数组函数。

?之后?可以使用explode来获取子字符串,substr来获取最后一个{{1}的位置}}}进入数组,并使用strrpos删除arg3,然后使用unset将字符串重新组合在一起。:

$string = "http://domain.com/php/doc.php?arg1=0&arg2=1&arg3=0";
$pos = strrpos($string, "?"); // get the position of the last ? in the string
$query_string_parts = array();

foreach (explode("&", substr($string, $pos + 1)) as $q)
{
  list($key, $val) = explode("=", $q);
  if ($key != "arg3")
  {
    // keep track of the parts that don't have arg3 as the key
    $query_string_parts[] = "$key=$val";
  }
}

// rebuild the string
$result = substr($string, 0, $pos + 1) . join($query_string_parts);

join

中查看此操作

答案 1 :(得分:0)

preg_replace("arg3=[^&]*(&|$)", "", $string)

我假设网址本身不会包含arg3=,这在一个理智的世界中应该是一个安全的假设。

答案 2 :(得分:0)

$new = preg_replace('/&arg3=[^&]*/', '', $string);

答案 3 :(得分:0)

这也应该有用,例如,考虑到页面锚点(#)以及你提到的那些“怪异角色”中的至少一些,但似乎并不担心:

function remove_query_part($url, $term)
{
    $query_str = parse_url($url, PHP_URL_QUERY);
    if ($frag = parse_url($url, PHP_URL_FRAGMENT)) {
        $frag = '#' . $frag;
    }
    parse_str($query_str, $query_arr);
    unset($query_arr[$term]);
    $new = '?' . http_build_query($query_arr) . $frag;
    return str_replace(strstr($url, '?'), $new, $url);
}

演示:

$string[] = 'http://domain.com/php/doc.php?arg1=0&arg2=1&arg3=0';
$string[] = 'http://domain.com/php/doc.php?arg1=0&arg2=1';
$string[] = 'http://domain.com/php/doc.php?arg1=0&arg2=1&arg3=0#frag';
$string[] = 'http://domain.com/php/doc.php?arg1=0&arg2=1&arg3=0&arg4=4';
$string[] = 'http://domain.com/php/doc.php';
$string[] = 'http://domain.com/php/doc.php#frag';
$string[] = 'http://example.com?arg1=question?mark&arg2=equal=sign&arg3=hello';

foreach ($string as $str) {
    echo remove_query_part($str, 'arg3') . "\n";
}

输出:

http://domain.com/php/doc.php?arg1=0&arg2=1
http://domain.com/php/doc.php?arg1=0&arg2=1
http://domain.com/php/doc.php?arg1=0&arg2=1#frag
http://domain.com/php/doc.php?arg1=0&arg2=1&arg4=4
http://domain.com/php/doc.php
http://domain.com/php/doc.php#frag
http://example.com?arg1=question%3Fmark&arg2=equal%3Dsign

仅按照显示进行测试。