问题是定界符和转义字符(正如其他人所提到的)。这将工作:
$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';
}
请注意,我在表达式的开头和结尾添加了一个正斜杠,并对模式中的正斜杠进行了转义(使用反斜杠)。
更进一步,这种模式将无法正确提取年份...只是一个世纪。您需要将其更改为(如Jan在下面指出的那样),如果要确保整个字符串匹配(而不是某些子集),则需要使用更类似的东西。/(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'];