From 62f0075cf34cffcb92a7ff1cc489c4bea07cb4e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sessing=C3=B8?= Date: Mon, 7 Aug 2017 22:18:36 +0200 Subject: [PATCH] Fixed wrong url matching on some paths (issue: #253 - thanks @alejoloe007jb) --- src/Pecee/SimpleRouter/Route/Route.php | 11 ++++++++--- test/RouterUrlTest.php | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/Pecee/SimpleRouter/Route/Route.php b/src/Pecee/SimpleRouter/Route/Route.php index f9f618f..b78d200 100644 --- a/src/Pecee/SimpleRouter/Route/Route.php +++ b/src/Pecee/SimpleRouter/Route/Route.php @@ -34,7 +34,12 @@ abstract class Route implements IRoute * @var bool */ protected $filterEmptyParams = false; - protected $defaultParameterRegex = null; + + /** + * Default regular expression used for parsing parameters. + * @var string|null + */ + protected $defaultParameterRegex; protected $paramModifiers = '{}'; protected $paramOptionalSymbol = '?'; protected $group; @@ -138,7 +143,7 @@ abstract class Route implements IRoute } } - $regex = sprintf('(?:\/|\-)' . $parameters[2][$key] . '(?P<%s>%s)', $name, $regex) . $parameters[2][$key]; + $regex = sprintf('(?:\/|\-)%1$s(?P<%2$s>%3$s)%1$s', $parameters[2][$key], $name, $regex); } @@ -151,7 +156,7 @@ abstract class Route implements IRoute $urlRegex = preg_quote($route, '/'); } - if (preg_match('/^' . $urlRegex . '\/?/', $url, $matches) > 0) { + if (preg_match('/^' . $urlRegex . '\/?$/', $url, $matches) > 0) { $values = []; diff --git a/test/RouterUrlTest.php b/test/RouterUrlTest.php index 91e42ab..c3cc363 100644 --- a/test/RouterUrlTest.php +++ b/test/RouterUrlTest.php @@ -8,6 +8,20 @@ require_once 'Helpers/TestRouter.php'; class RouterUrlTest extends PHPUnit_Framework_TestCase { + public function testIssue253() + { + TestRouter::get('/', 'DummyController@method1'); + TestRouter::get('/page/{id?}', 'DummyController@method1'); + + TestRouter::debugNoReset('/page/22', 'get'); + $this->assertEquals('/page/{id?}/', TestRouter::router()->getRequest()->getLoadedRoute()->getUrl()); + + TestRouter::debugNoReset('/', 'get'); + $this->assertEquals('/', TestRouter::router()->getRequest()->getLoadedRoute()->getUrl()); + + TestRouter::router()->reset(); + } + public function testOptionalParameters() { TestRouter::get('/aviso/legal', 'DummyController@method1');