Вход Регистрация
Файл: system/vendor/nikic/fast-route/src/RouteParser/Std.php
Строк: 73
<?php

namespace FastRouteRouteParser;

use 
FastRouteBadRouteException;
use 
FastRouteRouteParser;

/**
 * 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;
    }
}
Онлайн: 0
Реклама