0

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

当前代码:

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所以我希望通过上面的示例返回以下 URLhttp://www.example.com/students?order=swn&sort=DESC

有谁知道我该怎么做?我是 PHP 领域的新手。:)

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

示例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

4

2 回答 2

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() 和 PECL 安装

于 2013-05-28T00:12:53.280 回答
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, '', '&');
于 2013-05-28T00:15:48.107 回答