Функции date(), strtotime() и русская локаль тебе помогут.
А раз в этой теме, может тебе нужно именно регулярным выражением? Тогда приблизительно так:
PHP код:
$str_date=preg_replace(array('/(^\d{2}\-)01/si','/(^\d{2}\-)02/si','/(^\d{2}\-)03/si','/(^\d{2}\-)04/si','/(^\d{2}\-)05/si','/(^\d{2}\-)06/si','/(^\d{2}\-)07/si','/(^\d{2}\-)08/si','/(^\d{2}\-)09/si','/(^\d{2}\-)10/si','/(^\d{2}\-)11/si','/(^\d{2}\-)12/si'),array('\\1Январь','\\1Февраль','\\1Март','\\1Апрель','\\1Май','\\1Июнь','\\1Июль','\\1Август','\\1Сентябрь','\\1Окрябрь','\\1Ноябрь','\\1Декабрь'),$str_date);
Но, ИМХО, это изврат, зато в одну строчку!
Если уж нужно на регах, то помоему лучше уж так: (хоть и в 2 строки):
PHP код:
$month=array(1=>'Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Окрябрь','Ноябрь',12=>'Декабрь');
$str_date = preg_replace('/^(\d{2}\-)(\d{2})/esi', '"\\1{$month[\\2]}"', $str_date);
P.S. IMHO, не нужно изобретать велосипед для усложнения жизни, лучше наоборот, поэтому первый вариант (со специально реализованными разработчиками функциями)) я считаю самым предпочтительным!