Есть такой код:
$route = "letter/{page:[а-яё]{1,2}}/detail/{page:\d+}";
$route = preg_replace('/{([a-z]+):(.+)}/ui', '(?P<\1>\2)', $route);
var_dump($route);
$route = '#^'.$route.'$#u';
var_dump($route);
$url = "letter/вв/detail/2";
var_dump(preg_match($route, $url));
Результат:string(49) "letter/(?P<page>[а-яё]{1,2}}/detail/{page:\d+)"
string(54) "#^letter/(?P<page>[а-яё]{1,2}}/detail/{page:\d+)$#u"
int(0)
Как получить такой выхлоп:
# ..............................
# возможно, можно обойтись одним ?P
string(54) "#^letter/(?P<page>[а-яё]{1,2})/detail/(?P<page>\d+)$#u"
int(1)