You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.9 KiB
117 lines
2.9 KiB
<?php |
|
/** |
|
* 路由器解析器 |
|
* |
|
* @category typecho |
|
* @package Router |
|
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org) |
|
* @license GNU General Public License 2.0 |
|
* @version $Id$ |
|
*/ |
|
|
|
/** |
|
* 路由器解析器 |
|
* |
|
* @category typecho |
|
* @package Router |
|
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org) |
|
* @license GNU General Public License 2.0 |
|
*/ |
|
class Typecho_Router_Parser |
|
{ |
|
/** |
|
* 默认匹配表 |
|
* |
|
* @access private |
|
* @var array |
|
*/ |
|
private $_defaultRegx; |
|
|
|
/** |
|
* 路由器映射表 |
|
* |
|
* @access private |
|
* @var array |
|
*/ |
|
private $_routingTable; |
|
|
|
/** |
|
* 参数表 |
|
* |
|
* @access private |
|
* @var array |
|
*/ |
|
private $_params; |
|
|
|
/** |
|
* 设置路由表 |
|
* |
|
* @access public |
|
* @param array $routingTable 路由器映射表 |
|
*/ |
|
public function __construct(array $routingTable) |
|
{ |
|
$this->_routingTable = $routingTable; |
|
|
|
$this->_defaultRegx = array( |
|
'string' => '(.%s)', |
|
'char' => '([^/]%s)', |
|
'digital'=> '([0-9]%s)', |
|
'alpha' => '([_0-9a-zA-Z-]%s)', |
|
'alphaslash' => '([_0-9a-zA-Z-/]%s)', |
|
'split' => '((?:[^/]+/)%s[^/]+)', |
|
); |
|
} |
|
|
|
/** |
|
* 局部匹配并替换正则字符串 |
|
* |
|
* @access public |
|
* @param array $matches 匹配部分 |
|
* @return string |
|
*/ |
|
public function _match(array $matches) |
|
{ |
|
$params = explode(' ', $matches[1]); |
|
$paramsNum = count($params); |
|
$this->_params[] = $params[0]; |
|
|
|
if (1 == $paramsNum) { |
|
return sprintf($this->_defaultRegx['char'], '+'); |
|
} else if (2 == $paramsNum) { |
|
return sprintf($this->_defaultRegx[$params[1]], '+'); |
|
} else if (3 == $paramsNum) { |
|
return sprintf($this->_defaultRegx[$params[1]], $params[2] > 0 ? '{' . $params[2] . '}' : '*'); |
|
} else if (4 == $paramsNum) { |
|
return sprintf($this->_defaultRegx[$params[1]], '{' . $params[2] . ',' . $params[3] . '}'); |
|
} |
|
} |
|
|
|
/** |
|
* 解析路由表 |
|
* |
|
* @access public |
|
* @return array |
|
*/ |
|
public function parse() |
|
{ |
|
$result = array(); |
|
|
|
foreach ($this->_routingTable as $key => $route) { |
|
$this->_params = array(); |
|
$route['regx'] = preg_replace_callback("/%([^%]+)%/", array($this, '_match'), |
|
preg_quote(str_replace(array('[', ']', ':'), array('%', '%', ' '), $route['url']))); |
|
|
|
/** 处理斜线 */ |
|
$route['regx'] = rtrim($route['regx'], '/'); |
|
$route['regx'] = '|^' . $route['regx'] . '[/]?$|'; |
|
|
|
$route['format'] = preg_replace("/\[([^\]]+)\]/", "%s", $route['url']); |
|
$route['params'] = $this->_params; |
|
|
|
$result[$key] = $route; |
|
} |
|
|
|
return $result; |
|
} |
|
}
|
|
|