Вроде бы - ничего сложного. Но получается только вот так: PHP: function date2date ( $date ) { $p2 = '~^(0?[1-9]|[12]\d|3[01])[-./ ](0?[1-9]|1[012])[-./ ](\d{2})$~'; $p4 = '~^(0?[1-9]|[12]\d|3[01])[-./ ](0?[1-9]|1[012])[-./ ]((?:19|20)\d{2})$~'; if ( preg_match ( $p2, $date ) ) { return preg_replace ( $p2, '20$3-$2-$1', $date ); } elseif ( preg_match ( $p4, $date ) ) { return preg_replace ( $p4, '$3-$2-$1', $date ); } else return FALSE; } Можно ли этот код упростить - избавиться от двух preg_replace?
Не умничай, а сначала сам попробуй. PHP: echo date ('Y-m-d', strtotime ( '01.02.03' ) ) . "\n"; Правда, очень неожиданный результат?
Да, это видно из темы поста и из кода. Год вводится с формы и может быть как двузначным, так и 4-хзначным. Проверить формат можно одним preg_match, но вот как сделать замену одним preg_replace - не могу придумать.
При твоем нынешнем решении Код (Text): echo date2date('01.02.84');die(); тоже не самое очевидное поведение ;-)
ну, я бы тогда в своем варианте привел тоже привел к формату 01.02.2003 ;-) Короче говоря, всё от ситуации зависит. Имхо - излишнее юзабилити тоже вредно Если дата именно важная - я пользователю вводить её не дам, рассчитаю как-нибудь. А если это ему больше надо - типа его дня рождения - суну Дейтпикер. Если не так ввёл - его проблемы, будет 1970-01-01 или текущая )))) Сам виноват)))
Я не поленился и сравнил все три предложенных варианта по скорости. 1-й вариант - мой (2 preg_match и 2 preg_replace). Процедура изменена по сравнению с той, которая приводилась в 1-м посте. Я возвращаю не текстовую дату в формате yyyy-mm-dd, а сразу Unix Timestamp (т.к. в дальнейшем мне нужен именно timestamp). PHP: function date2date_v1 ( $date ) { $p2 = '~^(0?[1-9]|[12]\d|3[01])[-./ ](0?[1-9]|1[012])[-./ ](\d{2})$~'; $p4 = '~^(0?[1-9]|[12]\d|3[01])[-./ ](0?[1-9]|1[012])[-./ ]((?:19|20)\d{2})$~'; if ( preg_match ( $p2, $date ) ) { $date = preg_replace ( $p2, '20$3-$2-$1', $date ); } elseif ( preg_match ( $p4, $date ) ) { $date = preg_replace ( $p4, '$3-$2-$1', $date ); } else return FALSE; return strtotime ( $date ); } Второй вариант - отказаться от preg_replace и использовать mktime: PHP: function date2date_v2 ( $date ) { $p = '~^(0?[1-9]|[12]\d|3[01])[-./ ](0?[1-9]|1[012])[-./ ]((19|20)?\d{2})$~'; if ( preg_match ( $p, $date, $m ) ) return mktime ( 0, 0, 0, $m[2], $m[1], isset ( $m[4] ) ? $m[3] : 2000 + $m[3] ); else return FALSE; } И третий вариант - вместо preg_replace использовать preg_replace_callback: PHP: function date2date_v3 ( $date ) { $p = '~^(0?[1-9]|[12]\d|3[01])[-./ ](0?[1-9]|1[012])[-./ ]((19|20)?\d{2})$~'; if ( preg_match ( $p, $date ) ) return strtotime ( preg_replace_callback ( $p, create_function ( '$m', 'return ( isset ( $m[4] ) ? $m[3] : 2000 + $m[3] ) . "-" . $m[2] . "-" . $m[1];' ), $date ) ); else return FALSE; } Дальше я сделал коротенький тестик. Каздый вариант функции вызывался по 10000 раз с одним вариантом даты (2 цифры года) и по 10000 раз с другим вариантом даты (4 цифры года). Вот результаты (время в милисекундах): Код (Text): 01.02.03, v1: 0.33652591705322 01.02.03, v2: 0.30608820915222 01.02.03, v3: 0.77662396430969 01.02.2003, v1: 0.35748696327209 01.02.2003, v2: 0.31534099578857 01.02.2003, v3: 0.79184579849243 Победил вариант с mktime. Тему можно закрывать. Всем откликнувшимся - спасибо.