从查询字符串中删除某个变量

时间:2011-04-03 19:48:35

标签: php regex pcre

如何从查询字符串中删除某个变量?假设我有一个查询字符串

$query_string = "first=val1&second=val2&third=val3";

function removevar($var, $query_string) {
    return preg_replace("/(".$var."=[^&]*(&))/i","",$query_string);
}

echo removevar("first",$query_string); // ok
echo removevar("second",$query_string); // ok
echo removevar("third",$query_string); // doesn't change the string because third doesn't have a trailing &

如何解决这个问题,以便以健壮的方式从查询字符串中删除变量?可能有人已经有一个函数可以执行此操作以及更复杂的字符串中的特殊情况。

所以我必须匹配&或字符串结尾($),但我不知道如何将其转换为正则表达式。

6 个答案:

答案 0 :(得分:3)

$query_string = "first=val1&second=val2&third=val3";

function removevar($var, $query_string) {
    return preg_replace("/(".$var."=[^&]*(&|$))/i","",$query_string);
}

echo removevar("first",$query_string); // ok
echo removevar("second",$query_string); // ok
echo removevar("third",$query_string); // ok

这应该可以解决问题。

答案 1 :(得分:2)

你可能会有更多的运气:

  1. html_entity_decode获取'普通'查询字符串。
  2. parse_str将查询字符串转换为数组。
  3. unset该数组中所需的键。
  4. 使用http_build_query重建字符串。
  5. 在其上调用htmlspecialchars以使&返回&
  6. 比正则表达式路线简洁,但更不容易出错。

答案 2 :(得分:2)

您不一定需要正则表达式,因为PHP确实具有可以解析和构建查询字符串的函数(分别为parse_strhttp_build_query):

function removevar($var, $query_string) {
    parse_str($query_string, $args);
    unset($args[$var]);
    return http_build_query($args);
}

请注意,在使用这些函数之前,需要解码HTML字符引用。

答案 3 :(得分:2)

<?php
$query_string = "first=val1&amp;second=val2&amp;third=val3";
parse_str($query_string, $output);

function removevar($var, $output_array) {
  if (in_array($var, $output_array)) {
    unset($output_array[$var]);
  }

  return http_build_query($output_array, '', '&amp;');
}

echo removevar("first", $output);
echo removevar("third", $output);
?>

通常对于这样的代码,包含查询字符串,最好是使用内置的PHP函数而不是正则表达式语法/公式。这就是我所做的,代码的主要部分包括以下PHP内置函数: -

希望它有所帮助。

答案 4 :(得分:1)

function removevar($var, $query_string) {
    $query_string = preg_replace("#$var=([^&]+)#is", "", $query_string);
    return trim($query_string, "&amp;");
}

答案 5 :(得分:1)

有些函数可以直接处理查询字符串。

function removevar ($var, $query_string) {
  $array = array();
  parse_str(html_entity_decode($query_string), $array);
  unset($array[$var]);
  return html_entities(http_build_query($array);
}