public function compile(Route $route) { $tokens = []; $source = str_replace(['/', '[', ']', '(', ')'], ['\\/', '\\[', '\\]', '\\(', '\\)'], $route->getSourceRoute()); preg_match_all('#\\{\\w+\\}#', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); foreach ($matches as $match) { $name = substr($match[0][0], 1, -1); $regexpSource = $this->predefinedRules['alnumd']; $rule = $route->getRuleByName($name); if (isset($this->predefinedRules[$rule])) { $regexpSource = $this->predefinedRules[$rule]; } elseif ($rule) { $regexpSource = $rule; } $regexp = "({$regexpSource})"; $tokens[] = ['name' => $name, 'pattern' => $regexpSource, 'placeholder' => $match[0][0]]; $source = str_replace($match[0][0], $regexp, $source); } $route->setTokens($tokens); $route->setRoute("/^{$source}\$/"); return $route; }