preg_replace删除参数变量

时间:2013-01-21 06:18:41

标签: php url preg-replace

想从url字符串中删除p2变量,如果case 3同时删除?符号,则下面有3种情况。

案例1:http://www.domain.com/myscript.php?p1=xyz&p2=10&p3=ghj
结果:http://www.domain.com/myscript.php?p1=xyz&p3=ghj

案例2:http://www.domain.com/myscript.php?p2=10&p3=ghj
结果:http://www.domain.com/myscript.php?p3=ghj

案例3:http://www.domain.com/myscript.php?p2=10
结果:http://www.domain.com/myscript.php

想要使用单个preg_replace表达式来实现结果。

3 个答案:

答案 0 :(得分:2)

处理URL值时不要使用正则表达式。将它们作为URL而不是纯文本处理它会更容易(也更安全)。

这可能是一种方法:

  1. 首先拆分网址并解析查询字符串
  2. 取出参数
  3. 重建网址
  4. 以下代码就是这种算法的一个例子:

    // remove $qs_key from query string of $url
    // return modified url value
    function clean_url_qs($url, $qs_key)
    {
        // first split the url in two parts (at most)
        $parts = explode('?', $url, 2);
    
        // check whether query string is passed        
        if (isset($parts[1])) {
          // parse the query string into $params
          parse_str($parts[1], $params);
    
          // unset if $params contains $qs_key
          if (array_key_exists($qs_key, $params)) {
              // remove key
              unset($params[$qs_key]);
              // rebuild the url
              return $parts[0] . 
                  (count($params) ? '?' . http_build_query($params) : '');
          }
        }
        // no change required
        return $url;
    }
    

    测试代码:

    echo clean_url('http://www.domain.com/myscript.php?p1=xyz&p2=10&p3=ghj', 'p2'), "\n";
    echo clean_url('http://www.domain.com/myscript.php?p2=10&p3=ghj', 'p2'), "\n";
    echo clean_url('http://www.domain.com/myscript.php?p2=10', 'p2'), "\n";
    

答案 1 :(得分:1)

在我的一个旧项目中找到了这个(有点像shitcode,但是......),可以帮到你:

$unwanted_param = 'p2';
$s = 'http://www.domain.com/myscript.php?p1=xyz&p2=10&p3=ghj';
$s = parse_url($s);
$params = explode('&', $s['query']);
$out_params = array();
foreach ($params as $key => &$param) {
    list($name, $value) = explode('=', $param);
    if ($unwanted_param == $name) {
        unset($params[$key]);
    } else {
        $out_params[$name] = $value;
    }
}

$query = '?' . http_build_query($out_params);

$result = $s['scheme'] . '://' . $s['host'] . $s['path'] . $query;

var_dump($result);

答案 2 :(得分:0)

使用preg_replace,类似

$url = preg_replace('!([\?&]p2=[^&\?$]+)!i', '', $url);

但是,我个人会做以下事情

if (strpos($url, '?') !== false) {
    list($domain, $qstring) = explode('?', $url, 2);
    parse_str($qstring, $params);
    if (isset($params['p2'])) {
        unset($params['p2']);
    }
    $qstring = !empty($params) ? '?' . http_build_query($params) : '';
    $url = $domain . $qstring;
}