PHP中的字符串操作

时间:2009-09-29 04:31:44

标签: php regex query-string

我现在正在处理uri,例如/page.html?k1=1&k2=2

$str = preg_replace('/[&\?]' . $k . '=[^&]*/',"",$str);

以上目的是删除uri中的$ k相关部分,但也会删除?错误。

如何做正确的事?

4 个答案:

答案 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将其重新组合在一起。