- substr: documentation ( source)
- var_dump: documentation ( source)
- preg_match_all: documentation ( source)
- trim: documentation ( source)
<?php
/**
* Parses routes of the following form:
*
* "/user/{name}/{id:[0-9]+}"
*/
class Std {
const VARIABLE_REGEX = <<<'REGEX'
~\{
\s* ([a-zA-Z][a-zA-Z0-9_]*) \s*
(?:
: \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*)
)?
\}~x
REGEX;
const DEFAULT_DISPATCH_REGEX = '[^/]+';
public function parse($route) {
if (!preg_match_all(
self::VARIABLE_REGEX, $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;
}
}
$Parser = new Std;
var_dump( $Parser->parse("/user/{name}/{id:[0-9]+}") );