Можете подсказать как мне перевезти news/{id:\d}/edit в регулярное выражение?
при помощи регулярного выражения, как еще
когда-то решал эту задачу так
{name} - буквы-цифры
{:name} - число
{*name} - число со знаком + в начале)
public function match_route(string $routestr)
{
if (!(substr($routestr, -1) === '/'))
{
$routestr = $routestr . '/';
}
$routestr = preg_replace('/\{#\}\//', '(?:.*?)', $routestr);
$matches = [];
$param_names = [];
if (preg_match_all('/\{:[a-z_-]+\}/', $routestr, $matches)) {
$param_names = $matches[0];
$routestr = preg_replace('/\{:[a-z_-]+\}/', '(\d+)', $routestr);
}
if (preg_match_all('/\{[a-z_-]+\}/', $routestr, $matches)) {
$param_names = $matches[0];
$routestr = preg_replace('/\{[a-z_-]+\}/', '([a-zA-Z0-9_=\+\.\/-]+)', $routestr);
}
if (preg_match_all('/\{\*[a-z_-]+\}/', $routestr, $matches)) {
$param_names = $matches[0];
$routestr = preg_replace('/\{\*[a-z_-]+\}/', '(\+\d+)', $routestr);
}
if (!preg_match('#^'.$routestr.'$#', $this->uri, $matches))
return false;
$i = 0;
foreach ($param_names as $param) {
$param = trim($param, '{}:');
$i++;
if (isset($matches[$i]))
$this->named_params[$param] = $matches[$i];
}
for ($i=1; $i<count($matches); $i++) {
array_push($this->params, $matches[$i]);
}
return true;
}