添加具有多个值PHP的查询字符串变量

时间:2013-05-27 23:55:44

标签: php function foreach preg-replace

我发现了一些用于剥离查询字符串并为其添加新值的代码,但我希望能够通过一系列选项来执行此操作。有人可以帮我修改这段代码吗?

当前代码:

function add_querystring_var($url, $key, $value) {
    $url = preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&');
    $url = substr($url, 0, -1);    
    $value = $value ? "=".urlencode($value) : '';    
    if (strpos($url, '?') === false)
        return ($url . '?' . $key . $value);
    else
        return ($url . '&' . $key . $value);
}

我希望它为每个键和值给出一个foreach,然后重建新的url。

示例:add_querystring_var(curPageURL(), array("order","sort"), array("swn","DESC"))

所以我希望以下网址http://www.example.com/students在通过上面的示例时会返回http://www.example.com/students?order=swn&sort=DESC

有谁知道我怎么做到这一点?我是PHP的这个领域的新手。 :)

更新 我忘了提及有时网址可能有其他查询,所以我希望它替换我输入数组的那些。

示例1:http://www.example.com/students?page=2需要变成http://www.example.com/students?page=2&order=swn&sort=DESC

示例2:http://www.example.com/students?page=2&order=name&sort=ASC需要变成http://www.example.com/students?page=2&order=swn&sort=DESC

2 个答案:

答案 0 :(得分:1)

  function add_querystring_var($url, $additions) {
    $parsed = parse_url($url);
    if (isset($parsed['query'])) {
        parse_str($parsed['query'], $query);
    } else {
        $query = array();
    }
    $parsed['query'] = http_build_query(array_merge($query, $additions));
    return http_build_url($parsed);
  }

以这种方式使用:

$new_url = add_querystring_var($url, array('order' => 'swn', 'sort' => 'DESC'));

如果您收到错误消息,指出http_build_url未定义,请参阅

PHP http_build_url() and PECL Install

答案 1 :(得分:0)

你有点用这个功能重新发明轮子......首先,你最好在你的键/值数据上使用urlencode()而不是那个正则表达式(我看到你了)重新编码你的值字符串

正如dpDesignz在评论中提到的那样 - 有一个内置函数可用:http_build_query()

$querydata = array('foo' => array('bar', 'baz'),
          'baz'=>'boom',
          'cow'=>'milk',
          'php'=>'hypertext processor');

$querystring = http_build_query($data, '', '&');

或者,使用你的例子:

$querydata = array("order" => "swn", "sort" => "DESC");
$url = curPageURL();
$concat = "?";
if (strpos($url, "?") !== false)) {
    $concat = "&"
}
$url .= $concat . http_build_query($data, '', '&');