Как извлечь значения из URL и сопоставить их с помощью preg_match - PullRequest
0 голосов
/ 01 февраля 2020
$pathInfo = 'store/view/14342/galaxy-s10-lite-sm-g770-8gb';

У меня есть массив маршрутов как -

$route = [
   'store/{id}/{pid}' => ['home/store', ['id', 'exuo', 'pid']], 
   'store/{id}' => ['home/store', ['id']],
   'store/view/{id}/{name}' => ['home/store', ['id','name']], // pathInfo should match this route 
]; 

Как мне сопоставить $ pathInfo с соответствующим маршрутом.

Вот как я пытался это сделать -

    public function process_route() {
        if (is_array($this->routes()) && count($this->routes()) > 0) {
            //print_r([$this->rawPathInfo, $this->request, $this->route]) . "<br>";
            foreach ($this->routes() as $pattern => $rules) {
                $match = str_replace('/', '\/', $pattern);

                if (preg_match("/$match/", $this->pathInfo)) {
                    if (count(explode('/', $this->pathInfo)) == count(explode('/', $pattern))) {
                        $this->set_params($rules);

                        return $rules[0];
                    }
                }
            }
        }

        return FALSE;
    }

    protected function set_params($rules) {
        if (count($rules) >= 2) {
            if (is_array($rules[1]) && count($rules) >= 2) {
                $pathInfoArray = explode("/", $this->pathInfo);
                foreach ($rules[1] as $key) {
                    $index1 = array_search($key, $pathInfoArray);
                    $value = (isset($pathInfoArray[$index1 + 1])) ? $pathInfoArray[$index1 + 1] : self::$NOT_FOUND;
                    if ($value !== self::$NOT_FOUND)
                        $_GET[$key] = $value;
                }
            }
        }
    }

единственная разница здесь - я определил маршруты как

 $routes =[
   'store/id/.*/exuo/.*/pid/.*' => ['home/store', ['id', 'exuo', 'pid']], 
];

и сопоставил значения с полями (. *).

1 Ответ

0 голосов
/ 01 февраля 2020

Вы можете преобразовать пути маршрутов в соответствующие регулярные выражения, отметив $pathInfo для каждого из них, а затем вернуть первое, которое соответствует (если есть):

/**
 * @param string[] $routes
 */
function findRoute(array $routes, string $pathInfo): ?string
{
  foreach (array_keys($routes) as $routePath) {
    $pattern = '~^' . preg_replace('/{.*?}/', '[^/]+', $routePath) . '$~';
    if (preg_match($pattern, $pathInfo)) {
      return $routePath;
    }
  }
  return null;
}

Использование:

findRoute($routes, $pathInfo);

Демонстрация: https://3v4l.org/DoimK

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...