D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
opt
/
psa
/
admin
/
plib
/
modules
/
platform360
/
vendor
/
nikic
/
fast-route
/
src
/
RouteParser
/
Filename :
Std.php
back
Copy
<?php namespace Platform360\FastRoute\RouteParser; use Platform360\FastRoute\BadRouteException; use Platform360\FastRoute\RouteParser; /** * Parses route strings of the following form: * * "/user/{name}[/{id:[0-9]+}]" */ class Std implements RouteParser { const VARIABLE_REGEX = <<<'REGEX' \{ \s* ([a-zA-Z_][a-zA-Z0-9_-]*) \s* (?: : \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*) )? \} REGEX; const DEFAULT_DISPATCH_REGEX = '[^/]+'; public function parse($route) { $routeWithoutClosingOptionals = \rtrim($route, ']'); $numOptionals = \strlen($route) - \strlen($routeWithoutClosingOptionals); // Split on [ while skipping placeholders $segments = \preg_split('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \\[~x', $routeWithoutClosingOptionals); if ($numOptionals !== \count($segments) - 1) { // If there are any ] in the middle of the route, throw a more specific error message if (\preg_match('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \\]~x', $routeWithoutClosingOptionals)) { throw new BadRouteException('Optional segments can only occur at the end of a route'); } throw new BadRouteException("Number of opening '[' and closing ']' does not match"); } $currentRoute = ''; $routeDatas = []; foreach ($segments as $n => $segment) { if ($segment === '' && $n !== 0) { throw new BadRouteException('Empty optional part'); } $currentRoute .= $segment; $routeDatas[] = $this->parsePlaceholders($currentRoute); } return $routeDatas; } /** * Parses a route string that does not contain optional segments. * * @param string * @return mixed[] */ private function parsePlaceholders($route) { if (!\preg_match_all('~' . self::VARIABLE_REGEX . '~x', $route, $matches, \PREG_OFFSET_CAPTURE | \PREG_SET_ORDER)) { return [$route]; } $offset = 0; $routeData = []; foreach ($matches as $set) { if ($set[0][1] > $offset) { $routeData[] = \substr($route, $offset, $set[0][1] - $offset); } $routeData[] = [$set[1][0], isset($set[2]) ? \trim($set[2][0]) : self::DEFAULT_DISPATCH_REGEX]; $offset = $set[0][1] + \strlen($set[0][0]); } if ($offset !== \strlen($route)) { $routeData[] = \substr($route, $offset); } return $routeData; } }