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