preg_replace и неверное определение маршрута

Пробуюсь писать MVC-шку. При работе с preg_replace выбирается не верный маршрут и соответственно метод.

routes.php

<?php
return array(
    'news/(.+)' => 'NewsController@view',
    'news' => 'NewsController@index',
);

Router.php (метод run())

public function run()
    {
        $uri = $this->getURI();
        foreach ($this->routes as $uriPattern => $path) {
            if (preg_match("~$uriPattern~", $uri)) {
                echo "<br>Где ищем (запрос, который набрал пользователь): ".$uri;
                echo "<br>Что ищем (совпадение из правила): ".$uriPattern;
                echo "<br>Кто обрабатывает: ".$path;

                $internalRoute = preg_replace("~$uriPattern~", $path, $uri);
                echo "<pre>";
                print_r($internalRoute);
                echo "<pre/>";
                echo '<br>Нужно сформулировать: '.$internalRoute.'<br>'; // Ожидание: NewsController@view/z5
                $segments = Exploder::multiExplode(['/', '@'], $internalRoute);
                echo "<pre>";
                print_r($segments);
                echo "<pre/>";
                $controllerName = array_shift($segments);
                $methodName = array_shift($segments);
                $controllerFile = ROOT."/Controllers/".$controllerName.".php";
                if (file_exists($controllerFile)) {
                    require_once($controllerFile);
                }
                $controllerObject = new $controllerName;
                $result = $controllerObject->$methodName();

                if ($result != null) {
                    break;
                }

            }
        }
    }

Вывод на экране (localhost:8000/news/z5)


Где ищем (запрос, который набрал пользователь): news/z5
Что ищем (совпадение из правила): news/(.+)
Кто обрабатывает: NewsController@view
NewsController@view (( А должно быть NewsController@view/z5 ))

Нужно сформулировать: NewsController@view  (( А должно быть NewsController@view/z5 ))
Array
(
    [0] => NewsController
    [1] => view
)

Ответы (1 шт):

Автор решения: Alexander Chernykh

Прошу прощения за невнимательность. Контроллер и метод маршрута нужно заменить на

'news/([a-z]+)' => 'NewsController@view/$1',
→ Ссылка