0

想要p2从 url 字符串中删除变量,下面是 3 种情况,如果case 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 表达式实现结果。

4

3 回答 3

2

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

这可能是一种方法:

  1. 先拆分url,解析查询字符串
  2. 取出参数
  3. 重建网址

下面的代码是这种算法的一个例子:

// 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";
于 2013-01-21T06:36:40.863 回答
1

在我的一个旧项目中找到了这个(有点垃圾代码,但是......),可能会对您有所帮助:

$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);
于 2013-01-21T06:31:08.940 回答
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;
}
于 2013-01-21T06:54:04.263 回答