From ec667f83263a48339f4472f1539be5b366d4e513 Mon Sep 17 00:00:00 2001 From: thinkphp Date: Tue, 19 Jan 2016 14:53:30 +0800 Subject: [PATCH] =?UTF-8?q?Url=E7=94=9F=E6=88=90=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=94=9A=E7=82=B9=EF=BC=8C=E6=94=B9=E8=BF=9B=E5=9F=9F=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/think/Url.php | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/library/think/Url.php b/library/think/Url.php index 22addb5b..2fc5069a 100644 --- a/library/think/Url.php +++ b/library/think/Url.php @@ -26,15 +26,34 @@ class Url */ public static function build($url = '', $vars = '', $suffix = true, $domain = false) { + // 解析URL + $info = parse_url($url); + $url = !empty($info['path']) ? $info['path'] : ''; + if (isset($info['fragment'])) { + // 解析锚点 + $anchor = $info['fragment']; + if (false !== strpos($anchor, '?')) { + // 解析参数 + list($anchor, $info['query']) = explode('?', $anchor, 2); + } + if (false !== strpos($anchor, '@')) { + // 解析域名 + list($anchor, $domain) = explode('@', $anchor, 2); + } + } elseif (false !== strpos($url, '@')) { + // 解析域名 + list($url, $domain) = explode('@', $info['path'], 2); + } + // 解析参数 if (is_string($vars)) { // aaa=1&bbb=2 转换成数组 parse_str($vars, $vars); } - if (strpos($url, '?')) { - list($url, $params) = explode('?', $url); - parse_str($params, $params); + if (isset($info['query'])) { + // 解析地址里面参数 合并到vars + parse_str($info['query'], $params); $vars = array_merge($params, $vars); } @@ -63,22 +82,24 @@ class Url // URL后缀 $suffix = self::parseSuffix($suffix); + // 锚点 + $anchor = !empty($anchor) ? '#' . $anchor : ''; // 参数组装 if (!empty($vars)) { // 添加参数 if (Config::get('url_common_param')) { $vars = urldecode(http_build_query($vars)); - $url .= $suffix . '?' . $vars; + $url .= $suffix . $anchor . '?' . $vars; } else { foreach ($vars as $var => $val) { if ('' !== trim($val)) { $url .= $depr . $var . $depr . urlencode($val); } } - $url .= $suffix; + $url .= $suffix . $anchor; } } else { - $url .= $suffix; + $url .= $suffix . $anchor; } // 检测域名 @@ -136,6 +157,8 @@ class Url } } } + } else { + $domain = $domain . (strpos($domain, '.') ? '' : strstr($_SERVER['HTTP_HOST'], '.')); } $domain = (self::isSsl() ? 'https://' : 'http://') . $domain; } else {