diff --git a/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php b/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php index ce6baef939603..9d1d590e6c806 100644 --- a/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php +++ b/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php @@ -558,34 +558,27 @@ private function compileSwitchDefault(bool $hasVars, bool $matchHost): string $code = ''; } - $code .= $hasVars ? ' - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - }' : ' - break;'; - $code = sprintf(<<<'EOF' - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) {%s + if ('/' !== $pathinfo && %s$hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) {%s + break; } EOF , + $hasVars ? '!$hasTrailingVar && ' : '', $code ); if ($hasVars) { $code = <<<'EOF' - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; EOF .$code.<<<'EOF' + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; + } foreach ($vars as $i => $v) { if (isset($matches[1 + $i])) { @@ -665,31 +658,10 @@ private function compileRoute(Route $route, string $name, bool $checkHost, bool if ('/' !== $pathinfo && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { $matches = $n; } -EOF; - } elseif ($this->supportsRedirections && (!$methods || isset($methods['GET']))) { - $code .= <<<'EOF' - $hasTrailingSlash = false; - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) {%s - if ($trimmedPathinfo === $pathinfo) { - goto %s; - } - } EOF; } else { $code .= <<<'EOF' - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto %2$s; } EOF; diff --git a/src/Symfony/Component/Routing/Matcher/UrlMatcher.php b/src/Symfony/Component/Routing/Matcher/UrlMatcher.php index 5827c90535886..7329abdcd7588 100644 --- a/src/Symfony/Component/Routing/Matcher/UrlMatcher.php +++ b/src/Symfony/Component/Routing/Matcher/UrlMatcher.php @@ -156,21 +156,18 @@ protected function matchCollection($pathinfo, RouteCollection $routes) continue; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar = preg_match('#\{\w+\}/?$#', $route->getPath())) { - // no-op - } elseif (preg_match($regex, $trimmedPathinfo, $m)) { - $matches = $m; - } else { - $hasTrailingSlash = true; - } + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && preg_match('#\{\w+\}/?$#', $route->getPath()); - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ($supportsTrailingSlash && (!$requiredMethods || \in_array('GET', $requiredMethods))) { return $this->allow = $this->allowSchemes = []; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - continue; - } + + continue; + } + + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, $trimmedPathinfo, $m)) { + $matches = $m; } $hostMatches = []; diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php index 43264ca134091..8f73a63a2cec0 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php @@ -187,11 +187,7 @@ public function match($pathinfo) break; case 160: // foo1 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_foo1; } @@ -209,11 +205,7 @@ public function match($pathinfo) break; case 204: // foo2 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_foo2; } @@ -225,11 +217,7 @@ public function match($pathinfo) break; case 279: // foo3 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_foo3; } @@ -262,17 +250,12 @@ public function match($pathinfo) list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher10.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher10.php index c2547956fddc1..abec42c0b711c 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher10.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher10.php @@ -2794,17 +2794,12 @@ public function match($pathinfo) list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher11.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher11.php index 1a4f549d09bbf..325af4b7098d7 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher11.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher11.php @@ -119,20 +119,15 @@ private function doMatch(string $pathinfo, array &$allow = [], array &$allowSche list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ('GET' === $canonicalMethod && (!$requiredMethods || isset($requiredMethods['GET']))) { return $allow = $allowSchemes = []; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + break; + } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher12.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher12.php index 5ffc0c1b48cde..1fb5f9097fe47 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher12.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher12.php @@ -64,17 +64,12 @@ public function match($pathinfo) list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher13.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher13.php index e4b78e01dbdfa..7ef82709570a4 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher13.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher13.php @@ -44,11 +44,7 @@ public function match($pathinfo) switch ($m = (int) $matches['MARK']) { case 56: // r1 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_r1; } @@ -58,11 +54,7 @@ public function match($pathinfo) not_r1: // r2 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_r2; } diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php index 3426b358cbf7e..b7e03db8acc9e 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php @@ -230,11 +230,7 @@ private function doMatch(string $pathinfo, array &$allow = [], array &$allowSche break; case 160: // foo1 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_foo1; } @@ -252,22 +248,8 @@ private function doMatch(string $pathinfo, array &$allow = [], array &$allowSche break; case 204: // foo2 - $hasTrailingSlash = false; - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ('GET' === $canonicalMethod) { - return $allow = $allowSchemes = []; - } - if ($trimmedPathinfo === $pathinfo) { - goto not_foo2; - } + if ($trimmedPathinfo !== $pathinfo) { + goto not_foo2; } $matches = ['foo1' => $matches[1] ?? null]; @@ -278,22 +260,8 @@ private function doMatch(string $pathinfo, array &$allow = [], array &$allowSche break; case 279: // foo3 - $hasTrailingSlash = false; - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ('GET' === $canonicalMethod) { - return $allow = $allowSchemes = []; - } - if ($trimmedPathinfo === $pathinfo) { - goto not_foo3; - } + if ($trimmedPathinfo !== $pathinfo) { + goto not_foo3; } $matches = ['_locale' => $matches[1] ?? null, 'foo' => $matches[2] ?? null]; @@ -325,20 +293,15 @@ private function doMatch(string $pathinfo, array &$allow = [], array &$allowSche list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ('GET' === $canonicalMethod && (!$requiredMethods || isset($requiredMethods['GET']))) { return $allow = $allowSchemes = []; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + break; + } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php index fa0549606ba74..5f2239fede88d 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php @@ -84,17 +84,12 @@ public function match($pathinfo) list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher5.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher5.php index 4bd4b08f5fd82..21190f42d06a1 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher5.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher5.php @@ -124,20 +124,15 @@ private function doMatch(string $pathinfo, array &$allow = [], array &$allowSche list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ('GET' === $canonicalMethod && (!$requiredMethods || isset($requiredMethods['GET']))) { return $allow = $allowSchemes = []; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + break; + } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher6.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher6.php index caa2e3e220ac4..33b76f7527cf2 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher6.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher6.php @@ -98,17 +98,12 @@ public function match($pathinfo) list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher7.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher7.php index 2c0b58b106142..acf2a190a705f 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher7.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher7.php @@ -136,20 +136,15 @@ private function doMatch(string $pathinfo, array &$allow = [], array &$allowSche list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ('GET' === $canonicalMethod && (!$requiredMethods || isset($requiredMethods['GET']))) { return $allow = $allowSchemes = []; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + break; + } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher8.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher8.php index edbbb29cefa0d..ebdbc5ccb5939 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher8.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher8.php @@ -52,17 +52,12 @@ public function match($pathinfo) list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) {