0

URL文字列から変数を削除したい場合、以下は符号も削除するp2場合の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つの方法かもしれません:

  1. 最初に URL を分割し、クエリ文字列を解析します
  2. パラメータを取り出す
  3. URL を再構築する

以下のコードは、そのようなアルゴリズムの例です。

// 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

私の古いプロジェクトの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 に答える