/** * URIにGETクエリーを追加する(真面目にURLをパースしてから追加している) * * @access public * @param string $uri * @param string|array $add_get * @param boolean $add_sid * @param string|null $sepa * @return string */ function addQueryToUri($uri, $add_get, $add_sid = false, $sepa = '&') { $sepa_def = '&'; if (is_null($sepa)) { if (!($sepa = ini_get('arg_separator.output'))) { $sepa = $sepa_def; } } else { $before = ini_get('arg_separator.output'); ini_set('arg_separator.output', $sepa); } if (is_array($add_get)) { $add_get_ar = $add_get; $add_get_st = http_build_query($add_get); } else { $qe = explode($sepa, $add_get); // array('a=1', 'b=2') $qs = array(); foreach ($qe as $v) { $e = explode('=', $v, 2); if (strlen($e[0])) { $qs[$e[0]] = urldecode($e[1]); } } $add_get_ar = $qs; $add_get_st = $add_get; } // PHP Warning: parse_url(hoge.php?url=http://example.com/): Unable to parse URL if (strlen($uri) and $uri = preg_replace('/=(http|ftp|https):/', '=$1%3A', $uri) and $parsed = parse_url($uri)) { if (isset($parsed['query'])) { $qe = explode($sepa, $parsed['query']); // array('a=1', 'b=2') $qs = array(); foreach ($qe as $v) { $e = explode('=', $v, 2); if (strlen($e[0])) { $qs[$e[0]] = urldecode($e[1]); } } $add_get_st = http_build_query(array_merge($qs, $add_get_ar)); } if ($add_get_st) { $parsed['query'] = $add_get_st; } else { unset($parsed['query']); } $uri = UriUtil::glueUri($parsed); } else { $mark = strpos($uri, '?') === false ? '?' : $sepa; if ($add_get_st) { $uri .= $mark . $add_get_st; } } if (isset($before)) { ini_set('arg_separator.output', $before); } if (true === $add_sid) { $uri = UriUtil::addSIDToUri($uri, $sepa); } return $uri; }