Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191116
  • 博文数量: 99
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1045
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-15 14:24
文章分类
文章存档

2015年(9)

2014年(90)

我的朋友

分类: PHP

2014-11-20 15:16:40

本例可以实现
1.符合规则定义的伪静态访问路径解析
    对于"test.php/user/lists/normal/id/2.html" 可解析为
        control = user,action = lists,filter = normal,order = id,curPage = 3
    对于"test.php/users/lists.html" 可解析为
        control = user,action = lists,filter = all,order = '',curPage = 1 可取得规则定义中的默认值


2.不符合规则定义的伪静态路径解析
    action,control 不符合规则
        对于"test.php/users/lists/all/id1/1.html" 报错
        试图访问不存在的页面
    不符合匹配模式
        对于"test.php/user/lists/all/id1/1.html" 可解析为
        control = user,action = lists,filter = all,order = '',curPage = 1 
        可取得不符合匹配模式项目的默认值




// url 路由规则定义
$urlRule = array(
    'user' => array(        // control
        'lists' => array(    // action
            //'名称'        =>    '默认值,值模式匹配'
            'filter'    => 'all,^(all|normal|admin)$',
            'order'        => ',^-?[a-zA-Z_]+$',
            'curPage'    => '1,^[0-9]+$',
        ),
    ),
);


function parseUrl(){
    $queryString = array();
    $GLOBALS['control'] = 'index';
    $GLOBALS['action'] = 'index';
    if (isset($_SERVER['PATH_INFO'])){
        //获取  pathinfo
        $aPathInfo = explode('/', substr($_SERVER['PATH_INFO'], 1, strrpos($_SERVER['PATH_INFO'], '.')-1));
        // 获取 control
        $GLOBALS['control'] = $aPathInfo[0];
        array_shift($aPathInfo);
        // 获取 action
        $GLOBALS['action'] = (isset($aPathInfo[0]) ? $aPathInfo[0] : 'index');
        array_shift($aPathInfo);
        // 获取 入口文件名
        $GLOBALS['PHP_SELF'] = str_replace($_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF']);
        $queryString = $aPathInfo;
    }
    parseQueryString($queryString);
}


function parseQueryString(array$aQueryString){
    $queryString = array();
    // control 与 action 为默认值时 
    if ($GLOBALS['control'] == 'index' && $GLOBALS['action'] == 'index'){
        $GLOBALS['queryString'] = $queryString;
        return true;
    }
    global $urlRule;
    if (isset($urlRule[$GLOBALS['control']][$GLOBALS['action']])){
        $aActionRule = &$urlRule[$GLOBALS['control']][$GLOBALS['action']];
        foreach ($aActionRule as $key=>$val){
            // 规则值为 '' 时
            if ($val == '') {
                $queryString[$key] = '';
                continue;
            }
            if (isset($aQueryString[0])){
                // 取得正则表达式
                $pattern = '/'.substr($val, strpos($val, ',')+1).'/';
                // 模式匹配
                if (preg_match($pattern, $aQueryString[0])){
                    // 取值
                    $queryString[$key] = $aQueryString[0];
                    // 弹出值
                    array_shift($aQueryString);
                }else {
                    // 取默认值
                    $queryString[$key] = substr($val, 0, strpos($val, ','));
                }
            }else {
                // 取默认值
                $queryString[$key] = substr($val, 0, strpos($val, ','));
            }
        }
        $GLOBALS['queryString'] = $queryString;
    }else {
        throw new Exception('试图访问不存在的页面');
    }
}


parseUrl();


var_dump($GLOBALS['control']);
var_dump($GLOBALS['action']);
var_dump($GLOBALS['queryString']);
?>
阅读(1006) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~