diff --git a/src/WP_Route.php b/src/WP_Route.php index 22c31c1..4e8856c 100644 --- a/src/WP_Route.php +++ b/src/WP_Route.php @@ -129,7 +129,25 @@ private function getRouteParams($route){ } return $return; - } + } + + private function matchRouteToRequest($route, $request) { + $routes = $this->tokenize($route); + $requests = $this->tokenize($request); + + $diff = array_diff($routes, $requests); + + $matched = true; + + if( !empty($diff) ) { + foreach($diff as $k => $param) { + if( preg_match('/\{\s*.+?\s*\}/', $param) && !empty($requests[$k]) ) continue; + $matched = false; + } + } + + return $matched; + } // ----------------------------------------------------- @@ -141,7 +159,9 @@ public static function routes(){ } public function tokenize($url){ - return array_filter(explode('/', ltrim($url, '/'))); + extract( parse_url($url) ); + if( !isset($path) ) $path = ''; + return array_filter(explode('/', ltrim($path, '/'))); } public function requestURI(){ @@ -162,7 +182,13 @@ public function handle(){ if(count($this->tokenize($route->route)) !== count($tokenizedRequestURI)){ unset($routes[$key]); continue; - } + } + + // Filter routes that do not match the request + if( ! $this->matchRouteToRequest($route->route, $requestURI) ) { + unset($routes[$key]); + continue; + } // Add more filtering here as routing gets more complex. }