Регулярное выражение маршрутизации URL-адресов PHP

Я пишу класс, который обрабатывает маршрутизацию моего веб-сервиса PHP, но мне нужно исправить регулярное выражение, и я хочу знать, что будет наиболее эффективным способом анализа URL-адреса.

Примеры URL:

  • ПОСТ/пользователи
  • ПОЛУЧИТЬ /пользователи
  • ПОЛУЧИТЬ /users&limit=10&offset=0
  • ПОЛУЧИТЬ /users/search&keyword=Ричард
  • ПОЛУЧИТЬ /users/15/posts/38

То, что я хочу создать в 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...
        }
    }
}

Поэтому мне нужно регулярное выражение, которое в первую очередь:

  1. /mainAction/ :имя_аргумента/secondaryAction/ :имя_вторичного_действия

проверяет, соответствует ли это $reqUrl (, см. цикл for выше)

  1. Извлекает аргументы, чтобы мы могли использовать их в нашей функции обратного вызова.

Что пробовал сам:

(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];
}

Я очень ценю любую помощь, большое спасибо.

8
задан onlineracoon 30 July 2012 в 13:48
поделиться