Я пишу класс, который обрабатывает маршрутизацию моего веб-сервиса PHP, но мне нужно исправить регулярное выражение, и я хочу знать, что будет наиболее эффективным способом анализа URL-адреса.
Примеры URL:
То, что я хочу создать в PHP для класса, это:
$router = new Router();
$router->addRoute('POST', '/users', function(){});
$router->addRoute('GET', '/users/:uid/posts/:pid', function($uid, $pid){});
$target = $router->doRouting();
Целевая переменная теперь будет содержать массив с:
Вот что я получил до сих пор:
class Router{
use Singleton;
private $routes = [];
private $routeCount = 0;
public function addRoute($method, $url, $callback){
$this->routes[] = ['method' => $method, 'url' => $url, 'callback' => $callback];
$this->routeCount++;
}
public function doRouting(){
$reqUrl = $_SERVER['REQUEST_URI'];
$reqMet = $_SERVER['REQUEST_METHOD'];
for($i = 0; $i < $this->routeCount; $i++){
// Check if the url matches...
// Parse the arguments of the url...
}
}
}
Поэтому мне нужно регулярное выражение, которое в первую очередь:
проверяет, соответствует ли это $reqUrl (, см. цикл for выше)
Что пробовал сам:
(code should be in the for loop @ doRouting function)
// Extract arguments...
$this->routing[$i]['url'] = str_replace(':arg', '.+', $this->routing[$i]['url']);
// Does the url matches the routing url?
if(preg_match('#^'. $this->routes[$i]['url']. '$#', $reqUrl)){
return $this->routes[$i];
}
Я очень ценю любую помощь, большое спасибо.