I found the regular expression for MM/DD/YYYY at http://www.regular-expressions.info/regexbuddy/datemmddyyyy.html but I don\'t think I am using it correctly.
Here\'s
The problem is one of delimeters and escaped characters (as others have mentioned). This will work:
$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';
}
Note that I added a forward-slash to the beginning and ending of the expression and escapped (with a back-slash) the forward-slashes in the pattern.
To take it one step further, this pattern won't properly extract the year... just the century. You'd need to change it to /(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)/
and (as Jan pointed out below) if you want to make sure the whole string matches (instead of some subset) you'll want to go with something more like /^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)$/
.
As others have mentioned, strtotime() might be a better option if you're just trying to get the date out. It can parse almost any commonly used format and it will give you a unix timestamp. You can use it like this:
$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'];
To use this regex to validate dates in PHP code, you need to correctly format it as a string with additional regex delimiters as the PHP preg functions require. You also need to add anchors to force the regex to match the entire string (or else fail to match):
$date_regex = '%\A(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d\z%';
$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';
}
Of course, a library call would be better in this situation. The regex allows invalid dates such as February 31st.
The regex can be useful if you want to scan a string for dates. In that case you don't need the anchors. You may still need an extra check to exclude invalid dates. That depends on whether your input is know to contain only valid dates or not.
you can use the checkdate() function as well. No need regex.
$str="03/22/2010";
list($mth,$day,$yr)=explode("/",$str);
var_dump(checkdate($mth,$day,$yr));
This checks valid dates from MM/DD/1960
to MM/DD/2014
Also accepts dates like M/D/YYYY
and 0M/0D/YYYY
^(?:[1-9]|0[1-9]|1[0-2])/(?:[0-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])/(?:20[6-9][0-9]|20[0-1][0-4])$
Its probably better to use strtotime() which will convert nearly any human-readable date format to a unix timestamp. - http://php.net/manual/en/function.strtotime.php
You need correct delimiters around the pattern.
$date_regex = '~(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d~';