我现在正在处理uri,例如/page.html?k1=1&k2=2
$str = preg_replace('/[&\?]' . $k . '=[^&]*/',"",$str);
以上目的是删除uri中的$ k相关部分,但也会删除?错误。
如何做正确的事?
答案 0 :(得分:3)
试试这个:
preg_replace('/(?:(\?)|&)' . $k . '=[^&]*/', '$1', $str)
您还应在$k
上使用preg_quote
。
编辑以上是上述的扩展版本,可以修复beggs描述的问题:
/(?:(\?)|&)arg=[^&]*(?(1)(?:&|$))/
如果第一组找到匹配项,(?(1)(?:&|$))
epxression是conditional expression。因此,如果找到?
,则会删除该参数的尾随&
。
答案 1 :(得分:3)
要删除部分查询字符串,我不会使用正则表达式,而是使用存在的操作URL的函数。
例如,考虑这部分代码,它使用parse_url
函数来提取URL的一部分:
$url = '/page.html?k1=1&k2=2';
$parts = parse_url($url);
var_dump($parts);
你会得到:
array
'path' => string '/page.html' (length=10)
'query' => string 'k1=1&k2=2' (length=9)
现在,您可以使用parse_str
$params = array();
parse_str($parts['query'], $params);
var_dump($params);
哪能得到你:
array
'k1' => string '1' (length=1)
'k2' => string '2' (length=1)
现在,要删除一个参数,您可以测试它是否存在于数组中,如果是,则删除它:
$to_remove = 'k1';
if (array_key_exists($to_remove, $params)) {
unset($params[$to_remove]);
}
var_dump($params);
现在提供以下参数数组:
array
'k2' => string '2' (length=1)
最后,您可以使用http_build_query
:
$new_query = http_build_query($params);
var_dump($new_query);
你得到:
string 'k2=2' (length=4)
您现在只需在网址后注入此内容; - )
有些人可能会说它有点长...我会回答这个问题,看看这个代码,我立即理解它的目的 - 复杂的正则表达式并不是这样。
答案 2 :(得分:1)
它正在删除“?
”,因为您已将其包含在匹配中并使用空替换。要删除与“$k
”匹配的变量并保留“?
”,请使用Gumbo提供的代码,但请注意,当“$k
”==“k1
”时结果字符串将为“/page.html?&k2=2
”,请注意左侧“&
”。
答案 3 :(得分:1)
如果您正在处理URL和查询字符串,则可能需要使用parse_url来提取URL组件,并使用parse_str来提取查询字符串位。操纵参数数组而不是处理正则表达式要容易得多。然后,您可以使用http_build_query将其重新组合在一起。