想从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表达式来实现结果。
答案 0 :(得分:2)
处理URL值时不要使用正则表达式。将它们作为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";
答案 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;
}