wesley
2013-11-06 14:59:56 +08:00
我也写一个
<?php
class Route{
public static $rules = [];
public static function addRule($uri,$rule,$defaults=[])
{
//$rule_param = [];
self::$rules[] = ['regex'=> self::compileRule($uri,$rule) , 'defaults'=>$defaults ];
}
public static function compileRule($uri,$rule)
{
$uri = str_replace(')', ')?', $uri);
return preg_replace_callback(
"#<([^<>/\?]+)>#i",
function ($matches) use ($rule){
$name = $matches[1];
return "(?P<{$name}>" . ( !empty($rule[$name]) ? $rule[$name] : '[^<>/]+') . ')';
},
$uri
);
}
public static function parseUri($uri){
foreach (self::$rules as $rule_setting) {
if ( preg_match("#{$rule_setting['regex']}#i", $uri, $matches) ){
$ret = $rule_setting['defaults'];
foreach ($matches as $name => $value) {
$ret[$name] = $value;
}
return $ret;
}
}
return NULL;
}
}
//example
Route::addRule(
'<controller>/<action>(/<param>)',
['controller'=>'[a-z]+','action'=>'[a-z]+'],
['controller'=>'home','action'=>'index']
);
Route::addRule(
'a_<param>.html',
['param'=>'[0-9]+'],
['controller'=>'article','action'=>'detail']
);
print_r(Route::parseUri('a_1234.html'));
print_r(Route::parseUri('find/me'));
print_r(Route::parseUri('find/somebody/tom'));