*/ class Url { /** * 获取微信用的当前URL 去掉#后面的内容 * * @return string */ public static function weixin() { $url = self::current(); if (strpos($url, '#')) { $url = explode('#', $url)['0']; } return $url; } /** * 获取当前地址 * * @return string */ public static function current() { if (PHP_SAPI == 'cli') { return 'cli'; } if (strpos($_SERVER['REQUEST_URI'], 'http://') === 0) { return $_SERVER['REQUEST_URI']; } $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] === 443) ? 'https://' : 'http://'; $host = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : $_SERVER['HTTP_HOST']; $uri = isset($_SERVER['HTTP_X_REAL_URI']) ? $_SERVER['HTTP_X_REAL_URI'] : $_SERVER['REQUEST_URI']; return $protocol . $host . $uri; } /** * 生成url * * @param string $method * @param array $args * @param string $type * @param array $ignores * @return mixed|string */ public static function build($method = '', $args = [], $type = 'html', $ignores = []) { if (!empty($_REQUEST['template'])){ $args['template'] = $_REQUEST['template']; } static $rules = null, $_method = [], $power = false, $default_data = [], $ignore_params = [], $auto_calc = []; if ($rules === null) { $rules = Config::get('rewrite.rules'); $power = Config::get('rewrite.power', false); $default_data = Config::get('url.default_data', []); $ignore_params = Config::get('url.ignore_param', []); $auto_calc = Config::get('url.auto_calc', []); } $ignores = array_merge($ignores, $ignore_params); foreach ($args as $oarg_k => $oarg_v) { if ((isset($default_data[$oarg_k]) && $default_data[$oarg_k] == $oarg_v)) { unset($args[$oarg_k]); } } if (empty($_method[$method])) { if ($method === '') { $_method[$method] = strtolower(str_replace('\\', '.', Router::$controller) . '.' . Router::$action); } elseif (substr_count($method, '.') == 0) { $_method[$method] = strtolower(str_replace('\\', '.', Router::$controller) . '.' . $method); } else { $_method[$method] = strtolower($method); } } $method = $_method[$method]; if ($power && isset($rules[$method])) { foreach ($auto_calc as $key => $var) { if (isset($args[$key])) { foreach ($var as $item) { $args[$item['name']] = $item['func']($args[$key]); } } } $keys = []; $rule = $rules[$method]; $oargs = $args; foreach ($args as $key => &$arg) { $keys[] = '{' . $key . '}'; $arg = rawurlencode(urldecode($arg)); if (strpos($rule, '{' . $key . '}')) { unset($oargs[$key]); } } $url = self::clearUrl(str_replace($keys, $args, $rule)); if (strpos($url, ']')) { $url = strtr($url, ['[' => '', ']' => '']); } if (strpos($url, '{')) { foreach ($default_data as $default_k => $default_v) { if (strpos($url, '{' . $default_k . '}')) { $url = str_replace('{' . $default_k . '}', $default_v, $url); } } } if (!empty($oargs) && $ignores) { foreach ($oargs as $oarg_k => $oarg_v) { if (in_array($oarg_k, $ignores)) { unset($oargs[$oarg_k]); } } } $url = (substr($url, 0, 1) == '/' ? '' : '/') . $url; if (empty($oargs)) { return $url; } else { return $url . (strpos($url, '?') ? '&' : '?') . http_build_query($oargs); } } else { $type = $type ? $type : Response::getType(); $url = '/' . strtr($method, '.', '/') . '.' . $type; if ($args) { $url .= '?' . http_build_query($args); } return $url; } } /** * 清除url中可选参数 * * @param $url * @return mixed */ private static function clearUrl($url) { while (preg_match('#\[[^\[\]]*?\{\w+\}[^\[\]]*?\]#', $url, $match)) { $url = str_replace($match['0'], '', $url); } return $url; } }