//规则
public $urlMap = array( array('module', '', '\w+', NULL), array( array('type', 't', '\d+', 0), array('page', 'p', '\d+', 1) ));
private function _parseUrl() { //$uri = "/xxxx/xxxxx/"; $uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ""; $uris = explode("/", trim($uri, "/")); for ($i=0, $n=0, $count=count($this->urlMap); $i<$count;){ $urlMap = $this->urlMap[$i]; if (is_array($urlMap[0])){ $ok = false; $match = $this->_isMatch($urlMap, $uris[$n]); foreach ($urlMap as $map){ $key = $map[0]; $this->defaultValue[$key] = $map[3]; if ($match && isset($uris[$n]) && preg_match("/".$map[1]."(".$map[2].")/", $uris[$n], $mat)){ $val = ($mat[1] === NULL || $mat[1] === 'undefined') ? $map[3] : $mat[1]; $this->urlResult[$key] = array( $map[1], $val, $map[3] ); $this->requestParams[$key] = $val; $ok = true; } else { $this->urlResult[$key] = array($map[1], $map[3], $map[3]); } } if ($ok) $n++; } else { $key = $urlMap[0]; $this->defaultValue[$key] = $urlMap[3]; $matchStr = "/^".$urlMap[1]."(".$urlMap[2].")$/"; if(isset($urlMap[4])){ $matchStr = "/^".$urlMap[1]."(".$urlMap[2].")".$urlMap[4]."$/"; } if (preg_match($matchStr, $uris[$n], $mat)){ $val = ($mat[1] === NULL || $mat[1] === 'undefined') ? $urlMap[3] : $mat[1]; if ($key == 'keyword') { if (strpos($val, '+') === false) { $val = rawurldecode($val); } else { $val = urldecode($val); } } $this->urlResult[$key] = array( $urlMap[1], $val, $urlMap[3] ); if(isset($urlMap[4])){ $this->urlResult[$key][] = $urlMap[4]; } $this->requestParams[$key] = $val; $n++; } else { $this->urlResult[$key] = array($urlMap[1], $urlMap[3], $urlMap[3]); } } $i++; }
private function _isMatch($regexps, $str) { $ret = array(); foreach ($regexps as $val) { $ret[] = "({$val[1]}{$val[2]})?"; } $regexp = "/^".implode("", $ret)."$/"; return preg_match($regexp, $str); }url:
http://www.xxxx.com/abcde/t2/
解析后($this->requestParams):
Array ( [module] => abcde [type] => 2 [page] => 1 )