как правильно сделать регулярное выражение для роута? php
сейчас не совсем корректно обрабатывается url если ввести несуществующий в роутах http://localhost/directors/g/2 http://localhost/dd/directors/2
и еще можно найти посмотрите на роуты и и на регулярное выражение к ним preg_match("~(?<![\w\d])$uriPattern(?![\w\d])~", $uri)
как его сделать правильным чтобы некорректные адреса выводились как 404
//Directors
'director/([0-9]+)/delete' => 'DirectorController/actionDelete/$1',
'director/([0-9]+)/edit' => 'DirectorController/actionUpdate/$1',
'director/create' => 'DirectorController/actionCreate',
'directors/page-([0-9]+)' => 'DirectorController/actionIndex/$1',
'directors' => 'DirectorController/actionIndex',
//Router.php
<?php
namespace Components;
use \Controllers;
/**
* Класс Router
* Компонент для работы с маршрутами
*/
class Router {
private $routes;
public function __construct() {
$routesPath = ROOT . '/routes/routes.php';
$this->routes = include($routesPath);
}
/**
* returns request string
* @return type string
*/
private function getUri() {
$request = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_STRING);
if (!empty($request)) {
return trim($request, '/');
}
}
public function run() {
//Получить строку запроса
$uri = $this->getUri();
$result = null;
//Проверить наличие такого запроса в routes.php
foreach ($this->routes as $uriPattern => $path){
//Если есть совпадение определить какой контроллер и
//метод action обрабатывает запрос, параметры
if (preg_match("~(?<![\w\d])$uriPattern(?![\w\d])~", $uri)) {
// Получаем внутренний путь из внешнего согласно правилу.
$internalRoute = preg_replace("~$uriPattern~", $path, $uri);
$segments = explode('/', $internalRoute);
$controllerName = array_shift($segments);
$actionName = array_shift($segments);
$parameters = $segments;
//Получить обьект вызвать метод action
$controllerName = "\\Controllers\\" . $controllerName;
$controllerObject = new $controllerName;
/* Вызываем необходимый метод ($actionName) у определенного
* класса ($controllerObject) с заданными ($parameters) параметрами
*/
$result = call_user_func_array(array($controllerObject, $actionName), $parameters);
if ($result != null){
break;
}
}
}
if (!$result) {
header("HTTP/1.0 404 Not Found");
}
}
}
Ответы (1 шт):
При такой маршрутизации вы сопоставляете регулярке путь из URL (то, что после домена, но до вопроса). Домен и query-параметры не имеют значения. Значит надо работать только с path.
<?php
$path = parse_url($_SERVER['REQUEST_URI']?? '', PHP_URL_PATH);
В таком случае вы можете задать утверждения ^ и $. Ваша регулярка в итоге будет выглядеть так: ~^/directors/page-([0-9]+)$~. И не совпадёт с чем-то ещё.