buildPattern($template, $defaultPattern, $variablePatterns); parent::__construct($pattern, $targetClassName); } private function buildPattern($template, $defaultPattern, $variablePatterns) { if (is_null($variablePatterns)) { $variablePatterns = array(); } elseif (is_object($variablePatterns)) { $variablePatterns = (array) $variablePatterns; } if (!$defaultPattern) { $defaultPattern = self::RE_SLUG; } $pattern = ''; // Explode the template into an array of path segments. if ($template[0] === '/') { $parts = explode('/', substr($template, 1)); } else { $parts = explode('/', $template); } foreach ($parts as $part) { $pattern .= '\/'; // Is this part an expression or a literal? if (preg_match(self::URI_TEMPLATE_EXPRESSION_RE, $part, $matches)) { // This part of the path is an expresion. if (count($matches) === 2) { // Locate the name for the variable from the template. $variableName = $matches[1]; // If the caller passed an array with this variable name // as a key, use its value for the pattern here. // Otherwise, use the class's current default. if (isset($variablePatterns[$variableName])) { $variablePattern = $variablePatterns[$variableName]; } else { $variablePattern = $defaultPattern; } $pattern .= sprintf( '(?<%s>%s)', $variableName, $variablePattern ); } else { throw new InvalidArgumentException('Invalid URI Template.'); } } else { // This part is a literal. $pattern .= $part; } } $pattern = '/^' . $pattern . '$/'; return $pattern; } }