如何有效地使用以下两种方法之一添加GET参数?或;在PHP中?
我必须向url添加GET变量。但是URL可能已经有GET变量。添加这个新变量最有效的方法是什么 示例URL:如何有效地使用以下两种方法之一添加GET参数?或;在PHP中?,php,get,urlvariables,Php,Get,Urlvariables,我必须向url添加GET变量。但是URL可能已经有GET变量。添加这个新变量最有效的方法是什么 示例URL: 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 知道是否在字符串前面加上前缀的最有效方法是什么?还是& 以下是我迄今为止使用的函
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
知道是否在字符串前面加上前缀的最有效方法是什么?还是&
以下是我迄今为止使用的函数的一个版本:
// 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是否可能包含?
,但不包含实际查询,可能是作为转义字符。文档页面上说:
建立一个URL
根据flags参数,第二个URL的部分将合并到第一个URL中
添加:
如果你没有安装PECL,我们可以跳过一些环。在我们尝试重建新URL之前,这种方法有点可靠。股票PHP(减去PECL)没有parse\u url()
的反面。更难的是,parse_url()
从结果部件数组中的url中删除了一些语法,因此我们必须在重新组装时将它们放回http\u build\u 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";
s
现在$final_url已经添加了旧url和新参数 若要检查参数是否已存在,可以尝试
这将解析URL并将变量放入数组中
如果您要传递完整的URL,它会给您带来一些问题:
$url = "http://domain.com/index.html?name=jones&tag=xyz";
parse_str($url', $arr);
print_r($arr);
我会给你
Array ( [http://domain_com/index_html?name] => jones [tag] => xyz )
但是
$url = "name=jones&tag=xyz";
你会得到
Array ( [name] => jones [tag] => xyz )
您可以通过“?”分解完整URL并检查第二部分。检查后,您可以知道如何修改您的URL。但我不确定这是否会一直有效。?
在所有参数之前和之后/每个参数之间使用&
。检查请求中的?
,可能的重复项不会预测是否存在?param=
,您只需硬编码,如果原始URL没有参数,这将无法工作。这就是问题的关键所在:根据原始URL中的内容,您需要使用?
或&
http://www.stackoverflow.com";代码>将导致无效的url。是的,但有更好的方法吗?我不喜欢使用内置函数。呵呵,开玩笑吧。我同意,但这需要安装PECL。我正在尝试不使用它。@Ryan See编辑:我添加了一个不太理想但可行的版本,可以在没有PECL的情况下使用。
Array ( [name] => jones [tag] => xyz )