gpt4 book ai didi

php - 如何有效地添加带有 a 的 GET 参数?或者 & 在 PHP 中?

转载 作者:可可西里 更新时间:2023-11-01 00:44:41 27 4
gpt4 key购买 nike

我必须向 url 添加一个 GET 变量。但是 URL 可能已经有 GET 变量。添加这个新变量的最有效方法是什么?

示例网址:

http://domain.com/
http://domain.com/index.html?name=jones

我需要添加:tag=xyz:

http://domain.com/?tag=xyz
http://domain.com/index.html?name=jones&tag=xyz

知道是否要在我的字符串前添加 a 的最有效方法是什么?还是 &?

这是我目前拥有的函数的一个版本:

// where arrAdditions looks like array('key1'=>'value1','key2'=>'value2');
function appendUrlQueryString($url, $arrAdditions) {
$arrQueryStrings = array();
foreach ($arrAdditions as $k=>$v) {
$arrQueryStrings[] = $k . '=' . $v;
}
$strAppend = implode('&',$arrQueryStrings);
if (strpos($url, '?') !== false) {
$url .= '&' . $strAppend;
} else {
$url = '?' . $strAppend;
}
return $url;
}

但是,只是在现有的 url 中寻找 ? 有问题吗?例如,一个 url 是否可能包含一个 ? 而不是实际的查询,可能是一个转义字符?

最佳答案

看看PHP PECL's http_build_url .文档页面说:

Build a URL.

The parts of the second URL will be merged into the first according to the flags argument.

添加:

如果您没有安装 PECL,我们可以跳过一些障碍。在我们尝试重建新 URL 之前,这种方法有点可靠。 Stock PHP(减去 PECL)没有 parse_url() 的逆向。更难的是,parse_url() 从结果部分数组中的 URL 中删除了一些语法,因此我们必须在重新组合时将它们放回原处。 http_build_url() 可以为我们解决这个问题,但如果它可用,您就不会阅读这部分内容,因为它是我最初推荐的内容。不管怎样,这是代码:

<?php
/**
* addQueryParam - given a URL and some new params for its query string, return the modified URL
*
* @see http://us1.php.net/parse_url
* @see http://us1.php.net/parse_str
* @throws Exception on bad input
* @param STRING $url A parseable URL to add query params to
* @param MIXED $input_query_vars - STRING of & separated pairs of = separated key values OR ASSOCIATIVE ARRAY of STRING keys => STRING values
* @return STRING new URL
*/
function addQueryParam ($url, $input_query_vars) {
// Parse new parameters
if (is_string($input_query_vars)) {
parse_str($input_query_vars, $input_query_vars);
}

// Ensure array of parameters now available
if (!is_array($input_query_vars)) {
throw new Exception(__FUNCTION__ . ' expects associative array or query string as second parameter.');
}

// Break up given URL
$url_parts = parse_url($url);

// Test for proper URL parse
if (!is_array($url_parts)) {
throw new Exception(__FUNCTION__ . ' expects parseable URL as first parameter');
}

// Produce array of original query vars
$original_query_vars = array();
if (isset($url_parts['query']) && $url_parts['query'] !== '') {
parse_str($url_parts['query'], $original_query_vars);
}

// Merge new params inot original
$new_query_vars = array_merge($original_query_vars, $input_query_vars);

// replace the original query string
$url_parts['query'] = http_build_query($new_query_vars);

// Put URL grammar back in place
if (!empty($url_parts['scheme'])) {
$url_parts['scheme'] .= '://';
}

if (!empty($url_parts['query'])) {
$url_parts['query'] = '?' . $url_parts['query'];
}

if (!empty($url_parts['fragment'])) {
$url_parts['fragment'] = '#' . $url_parts['fragment'];
}

// Put it all back together and return it
return implode('', $url_parts);
}

// Your demo URLs
$url1 = 'http://domain.com/';
$url2 = 'http://domain.com/index.html?name=jones';

//Some usage (I did this from CLI)
echo $url1, "\n";
echo addQueryParam($url1, 'tag=xyz'), "\n";
echo addQueryParam($url1, array('tag' => 'xyz')), "\n";

echo $url2, "\n";
echo addQueryParam($url2, 'tag=xyz'), "\n";
echo addQueryParam($url2, array('tag' => 'xyz')), "\n";
echo addQueryParam($url2, array('name' => 'foo', 'tag' => 'xyz')), "\n";

关于php - 如何有效地添加带有 a 的 GET 参数?或者 & 在 PHP 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22538114/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com