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;
    }
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
分析站内URL