buildPattern($template, $defaultPattern, $variablePatterns); parent::__construct($pattern, $middleware); } /** * Translate the URI template into a regular expression. * * @param string $template URI template the path must match * @param string $defaultPattern Regular expression for variables * @param array $variablePatterns Map of variable names and regular expression * @return string */ private function buildPattern($template, $defaultPattern, $variablePatterns) { // Ensure $variablePatterns is an array. if (is_null($variablePatterns)) { $variablePatterns = array(); } elseif (is_object($variablePatterns)) { $variablePatterns = (array) $variablePatterns; } // Ensure a default is set. if (!$defaultPattern) { $defaultPattern = self::RE_SLUG; } // Convert the template into the pattern $pattern = $template; // Escape allowable characters with regex meaning. $pattern = str_replace( array("-", "."), array("\\-", "\\."), $pattern); // Replace * with .* AFTER escaping to avoid escaping .* $pattern = str_replace("*", ".*", $pattern); // Surround the pattern with delimiters. $pattern = "~^{$pattern}$~"; // Replace all template variables with matching subpatterns. $callback = function ($matches) use ($variablePatterns, $defaultPattern) { $key = $matches[1]; if (isset($variablePatterns[$key])) { $pattern = $variablePatterns[$key]; } else { $pattern = $defaultPattern; } return "(?<{$key}>{$pattern})"; }; $pattern = preg_replace_callback(self::URI_TEMPLATE_EXPRESSION_RE, $callback, $pattern); return $pattern; } }