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 my code:
开发者_如何转开发$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';
}
When I run this, it still echoes 'this date is not formatted correctly', when it should be saying the opposite. How do I set this regular expression up in php?
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'];
Regex of the author of the question is almost correct. Date is not validated because a pattern should be:
pattern="^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|20)\d\d$"
or if to be fancy:
pattern="^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"
Please note that this pattern checks only for a format of a date and max/min values for individual date elements. That means a user's entry should be checked for validity of date in JavaScript function and/or a Server (e.g February 29 should not be allowed if a year is not a leap one).
As a side note, if you would like to allow a single digit (let's say for a month), change a month part to
([0-9]|0[1-9]|1[012])
Explanation:
[0-9] - single digit between 0 and 9
or
0[1-9] - two digits between 01 and 09
or
1[012] - two digits limited to 10, 11, 12
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~';
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));
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.
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])$
Your regex needs delimiters:
/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/
String timeStamp = "03/11/2018 17:51:45";
private static Pattern TIMESTAMP_PATTERN = Pattern.compile("(0?[1-9]|1[012])/(0?[1-9]|[1-2][0-9]|3[0-1])/" + "([1-9][0-9]{3}) ([0-1]?[0-9]|2[0-3]):([0-5]?[0-9]):([0-5]?[0-9])");
private static boolean isTimeStampValid(String timeStamp) {
boolean isFeb = timeStamp.split("/")[0].matches("(0?[2])");
if (isFeb) {
boolean isValidFebDate = timeStamp.split("/")[1].matches("(0?[1-9]|1[1-9]|2[0-8])");
if (!isValidFebDate) return false;
}
return TIMESTAMP_PATTERN.matcher(timeStamp).matches();
}
精彩评论