Проблема в одном из разделителей и экранированных символов (как уже упоминалось). Это будет работать:
$date_regex = '/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/';
$test_date = '03/22/2010';
if(preg_match($date_regex, $test_date)) {
echo 'this date is formatted correctly';
} else {
echo 'this date is not formatted correctly';
}
Обратите внимание, что я добавил косую черту в начало и конец выражения и удалил (с обратной косой чертой) косую черту в шаблоне.
Чтобы сделать еще один шаг вперед, эта модель не будет правильно извлекать год ... только столетие. Вам нужно изменить его на /(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)/
и (как Ян указал ниже), если вы хотите убедиться, что вся строка соответствует (а не подмножество), вы захотите использовать что-то более похожее на /^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)$/
.
Как уже упоминали другие, strtotime () может быть лучшим вариантом, если вы просто пытаетесь получить дату. Он может анализировать практически любой широко используемый формат и даст вам метку времени Unix. Вы можете использовать это так:
$test_date = '03/22/2010';
// get the unix timestamp for the date
$timestamp = strtorime($test_date);
// now you can get the date fields back out with one of the normal date/time functions. example:
$date_array = getdate($timestamp);
echo 'the month is: ' . $date_array['month'];