@maks78945

Как правильно сделать router самому?

Доброго времени суток, пробую сделать сам роутер.
получилось реализовать по прямом совпадению роутера, например news/all
но у меня возникла проблема как реализовать news/88/edit

Гуглить пробовал, извилины напрягал, но никак. Всё к чему у меня получилось прийти это что роут должен быть записан вот в таком виде news/{id:\d}/edit и его нужно перевести в регулярное выражение и проверить url на совпадение по регулярному выражению.

Можете подсказать как мне перевезти news/{id:\d}/edit в регулярное выражение?
  • Вопрос задан
  • 433 просмотра
Решения вопроса 2
profesor08
@profesor08 Куратор тега PHP
https://www.php.net/manual/ru/function.parse-url.php

Парси, и смотри что есть что и решай что с этим делать.
Ответ написан
solotony
@solotony
покоряю пик Балмера
Можете подсказать как мне перевезти news/{id:\d}/edit в регулярное выражение?


при помощи регулярного выражения, как еще

когда-то решал эту задачу так

{name} - буквы-цифры
{:name} - число
{*name} - число со знаком + в начале)

public function match_route(string $routestr)
    {
        if (!(substr($routestr, -1) === '/'))
        {
            $routestr = $routestr . '/';
        }

        $routestr = preg_replace('/\{#\}\//', '(?:.*?)', $routestr);

        $matches = [];
        $param_names = [];

        if (preg_match_all('/\{:[a-z_-]+\}/', $routestr, $matches)) {
            $param_names = $matches[0];
            $routestr = preg_replace('/\{:[a-z_-]+\}/', '(\d+)', $routestr);
        }

        if (preg_match_all('/\{[a-z_-]+\}/', $routestr, $matches)) {
            $param_names = $matches[0];
            $routestr = preg_replace('/\{[a-z_-]+\}/', '([a-zA-Z0-9_=\+\.\/-]+)', $routestr);
        }

        if (preg_match_all('/\{\*[a-z_-]+\}/', $routestr, $matches)) {
            $param_names = $matches[0];
            $routestr = preg_replace('/\{\*[a-z_-]+\}/', '(\+\d+)', $routestr);
        }

        if (!preg_match('#^'.$routestr.'$#', $this->uri, $matches))
            return false;

        $i = 0;
        foreach ($param_names as $param) {
            $param = trim($param, '{}:');
            $i++;
            if (isset($matches[$i]))
                $this->named_params[$param] = $matches[$i];
        }

        for ($i=1; $i<count($matches); $i++) {
            array_push($this->params, $matches[$i]);
        }

        return true;
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы