lib/adapter/Simple.php
public function parse($uri) 
    {
        $this->initRoutArg();
        $opts = &$this->cfg;
        
        // 取得index.php?及后面部分
        // 去掉域名
        $uri = preg_replace("/((http|https)\\:\\/\\/.*?\\/)/", '', $uri); 
        $uri = trim($uri, '/');
        
        // 去掉站点根目录路径.
        $basePath = trim($opts['basePath'], '/');
        if($basePath && $basePath === substr($uri, 0, strlen($basePath))){
            $uri = substr($uri, strlen($basePath));
            $uri = trim($uri, '/');
        }
        
        // no rewrite: {$opts['scriptName']}?$mod.$ctl.$act/$act_params/$key1:$val1/$key2:$val2[/...].$ext&$query#$fragment
        // rewrite: $mod.$ctl.$act/$act_params/$key1:$val1/$key2:$val2[/...].$ext?$query#$fragment
        
        // 去掉index.php?或index.php/
        if($uri && $opts['scriptName'] === substr($uri, 0, strlen($opts['scriptName']))){
            $uri = substr($uri, strlen($opts['scriptName']));
        }
        $uri = trim($uri, './?');
        
        if (!$uri) {
            // 首页
            $this->buildCtlClass();            
            return $this;
        }

        // 将uri统一为：$mod.$ctl.$act/$act_params/$key1:$val1/$key2:$val2[/...].$ext&$query#fragment
        $uri && $uri = str_replace('?', '&', $uri);

        // 提取锚，并把锚串从uri中去掉
        if(false !== $pos = strpos($uri, '#')) {
            $this->anchor = substr($uri, $pos + 1);
            $uri = substr($uri, 0, $pos);
        }

        // 提取常规查询串参数，并把查询串从uri中去掉
        if (false !== $pos = strpos($uri, '&')) {
            $this->query = substr($uri, $pos + 1);
            $uri = substr($uri, 0, $pos);
        }
        
        // 去掉伪静态后缀
        if($opts['rewriteExt'] && $opts['rewriteExt'] === substr($uri,  - strlen($opts['rewriteExt']))) {
            $uri = substr($uri, 0,  - strlen($opts['rewriteExt']));
        }
        
        // URI解码
        if ($opts['encode'] && preg_match("/q_(.+)/", $uri, $mat)) {
            // base64编码的变体，+/字符使用方便URL中传输的-_字符
            $uri = base64_decode(strtr($mat[1], '-_', '+/'));
        }
        
        // /name:value 键值对变量
        if(preg_match_all("#/([^/&]+?\\:([^/&\\?]|$)*)#", $uri, $match)) {
            // 提取变量
            $attrStr = str_replace(':', '=', implode('&', $match[1]));
            parse_str($attrStr, $attributes);
            
            $this->attributes = $attributes;

            $uri = preg_replace("#/[^/&]+?\\:([^/&\\?]|$)*#", '', $uri);
        }
        
        // 请求参数
        $actArgs = explode("/", $uri);
        
        // 提取mod,ctl,act
        // 如果第一个/前只包含字母、数字、下划线和点符号，则是合法的路由ID
        if (!preg_match("/[^a-z0-9_\\.]+/i", $actArgs[0])) {
            $routeId = array_shift($actArgs);
            
            // $routeId没有.则可能是简化URL后的$route
            if (false === strpos($routeId, '.')) {
                // 简短url还原
                $routeKey = strtolower($routeId);
                if(array_key_exists($routeKey, $opts['alias'])) {
                    $routeId = $opts['alias'][$routeKey];                    
                    // $routeId中有 / 则需要重新取得$actArgs、$routeId参数
                    if (false !== stripos($routeId, '/')) {
                        array_unshift($actArgs, $routeId);
                        $actArgs = explode("/", implode('/', $actArgs));
                        $routeId = array_shift($actArgs);
                    }
                }
            }
            
            $routeArr = explode('.', $routeId);

            // 如果启用模块则提取模块，则提取第一个点号前面的模块名
            if ($opts['useModule']) {
                $this->mod = strtolower(array_shift($routeArr));
            }
            
            // 如果acttion不为空，则取最后一个点号后面的action名
            if(isset($routeArr[1])) {
                // 
                $this->act = strtolower(array_pop($routeArr)); // else = defaultAct
            }            
            
            // 取控制器类标识
            if ($routeArr) {
                $this->ctl = strtolower(join('.', $routeArr)); // else = defaultCtl
            }
        } // else mod = defaultMod
        
        // action参数
        $this->actParams = $actArgs;

        $this->buildCtlClass();
        
        return $this;
    }
public function parse($uri) 
    {
        $this->initRoutArg();
        $opts = &$this->cfg;
        
        // 取得index.php?及后面部分
        // 去掉域名
        $uri = preg_replace("/((http|https)\\:\\/\\/.*?\\/)/", '', $uri); 
        $uri = trim($uri, '/');
        
        // 去掉站点根目录路径.
        $basePath = trim($opts['basePath'], '/');
        if($basePath && $basePath === substr($uri, 0, strlen($basePath))){
            $uri = substr($uri, strlen($basePath));
            $uri = trim($uri, '/');
        }
        
        // no rewrite: {$opts['scriptName']}?$mod.$ctl.$act/$act_params/$key1:$val1/$key2:$val2[/...].$ext&$query#$fragment
        // rewrite: $mod.$ctl.$act/$act_params/$key1:$val1/$key2:$val2[/...].$ext?$query#$fragment
        
        // 去掉index.php?或index.php/
        if($uri && $opts['scriptName'] === substr($uri, 0, strlen($opts['scriptName']))){
            $uri = substr($uri, strlen($opts['scriptName']));
        }
        $uri = trim($uri, './?');
        
        if (!$uri) {
            // 首页
            $this->buildCtlClass();            
            return $this;
        }

        // 将uri统一为：$mod.$ctl.$act/$act_params/$key1:$val1/$key2:$val2[/...].$ext&$query#fragment
        $uri && $uri = str_replace('?', '&', $uri);

        // 提取锚，并把锚串从uri中去掉
        if(false !== $pos = strpos($uri, '#')) {
            $this->anchor = substr($uri, $pos + 1);
            $uri = substr($uri, 0, $pos);
        }

        // 提取常规查询串参数，并把查询串从uri中去掉
        if (false !== $pos = strpos($uri, '&')) {
            $this->query = substr($uri, $pos + 1);
            $uri = substr($uri, 0, $pos);
        }
        
        // 去掉伪静态后缀
        if($opts['rewriteExt'] && $opts['rewriteExt'] === substr($uri,  - strlen($opts['rewriteExt']))) {
            $uri = substr($uri, 0,  - strlen($opts['rewriteExt']));
        }
        
        // URI解码
        if ($opts['encode'] && preg_match("/q_(.+)/", $uri, $mat)) {
            // base64编码的变体，+/字符使用方便URL中传输的-_字符
            $uri = base64_decode(strtr($mat[1], '-_', '+/'));
        }
        
        // /name:value 键值对变量
        if(preg_match_all("#/([^/&]+?\\:([^/&\\?]|$)*)#", $uri, $match)) {
            // 提取变量
            $attrStr = str_replace(':', '=', implode('&', $match[1]));
            parse_str($attrStr, $attributes);
            
            $this->attributes = $attributes;

            $uri = preg_replace("#/[^/&]+?\\:([^/&\\?]|$)*#", '', $uri);
        }
        
        // 请求参数
        $actArgs = explode("/", $uri);
        
        // 提取mod,ctl,act
        // 如果第一个/前只包含字母、数字、下划线和点符号，则是合法的路由ID
        if (!preg_match("/[^a-z0-9_\\.]+/i", $actArgs[0])) {
            $routeId = array_shift($actArgs);
            
            // $routeId没有.则可能是简化URL后的$route
            if (false === strpos($routeId, '.')) {
                // 简短url还原
                $routeKey = strtolower($routeId);
                if(array_key_exists($routeKey, $opts['alias'])) {
                    $routeId = $opts['alias'][$routeKey];                    
                    // $routeId中有 / 则需要重新取得$actArgs、$routeId参数
                    if (false !== stripos($routeId, '/')) {
                        array_unshift($actArgs, $routeId);
                        $actArgs = explode("/", implode('/', $actArgs));
                        $routeId = array_shift($actArgs);
                    }
                }
            }
            
            $routeArr = explode('.', $routeId);

            // 如果启用模块则提取模块，则提取第一个点号前面的模块名
            if ($opts['useModule']) {
                $this->mod = strtolower(array_shift($routeArr));
            }
            
            // 如果acttion不为空，则取最后一个点号后面的action名
            if(isset($routeArr[1])) {
                // 
                $this->act = strtolower(array_pop($routeArr)); // else = defaultAct
            }            
            
            // 取控制器类标识
            if ($routeArr) {
                $this->ctl = strtolower(join('.', $routeArr)); // else = defaultCtl
            }
        } // else mod = defaultMod
        
        // action参数
        $this->actParams = $actArgs;

        $this->buildCtlClass();
        
        return $this;
    }
分析站内URL

取得链接应该映射到哪个模块、控制器、动作，并且传什么参数到动作方法中。

@param string $uri
@return \wf\route\RouteAbstract