$to_match = preg_replace('/{([a-z]+):([^\}]+)}/', '(?P<\1>\2)', $to_match);
$to_match = '#^'.$to_match.'$#';
item/{name:\w+}
. Если перейти по адресу item/item_name
, то все нормально. Но если перейти по item/item-name
, то уже не находит совпадений.