routes[] = [ "path"=> $path, "params"=> $params ]; } public function match (string $path,): array|bool { $path = trim($path, "/"); foreach ($this->routes as $route) { $pattern = $this->getPatternFromRoutePath($route["path"]); echo $pattern, "\n"; if(preg_match($pattern, $path, $matches)) { $matches = array_filter($matches, "is_string", ARRAY_FILTER_USE_KEY); $params = array_merge($matches, $route["params"]); return $params; } } return false; } private function getPatternFromRoutePath(string $route_path): string { $route_path = trim("$route_path", "/"); $segments = explode("/", $route_path); $segments = array_map(function(string $segment) :string { if(preg_match("#^\{([a-z][a-z0-9]*)\}$#", $segment, $matches)) { return "(?<" . $matches[1] . ">[^/]*)"; } if(preg_match("#^\{([a-z][a-z0-9]*):(.+)\}$#", $segment, $matches)) { return "(?<" . $matches[1] . ">". $matches[2] ."[^/]*)"; } return $segment; }, $segments); return "#^" . implode("/", $segments) . "$#"; } }