10

我显然没有正确使用filter_var()。我需要检查用户是否输入了有效日期,格式为“dd/mm/yyyy”。

这只是返回我作为日期传递的任何内容,而我希望它返回日期或 0/null/FALSE,以防输入字符串看起来不像日期:

$myregex = "/\d{2}\/\d{2}\/\d{4}/";
print filter_var("bad 01/02/2012 bad",FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=> $myregex)));

如果其他人使用此功能检查日期,我做错了什么?我应该使用另一个函数来验证表单字段吗?

谢谢你。

4

9 回答 9

26

使用正则表达式来验证日期是一个坏主意..想象一下99/99/9999很容易被视为有效日期..你应该检查日期

bool checkdate ( int $month , int $day , int $year )

简单用法

$date = "01/02/0000";
$date = date_parse($date); // or date_parse_from_format("d/m/Y", $date);
if (checkdate($date['month'], $date['day'], $date['year'])) {
    // Valid Date
}
于 2012-12-06T15:05:03.520 回答
16
$myregex = '~^\d{2}/\d{2}/\d{4}$~';

正则表达式匹配,因为您只需要在字符串中的任何位置使用该模式。你想要的只是那个模式,没有别的。所以添加^$

请注意,这并不意味着该值是有效的 date99/99/9999将通过该测试。我会使用:

if (!DateTime::createFromFormat('d/m/Y', $string))
于 2012-12-06T15:02:48.127 回答
5

在 PHP 中验证日期的一种简单方便的方法是strtotime函数。您可以只用一行来验证日期:

strtotime("bad 01/02/2012 bad"); //false
strtotime("01/02/2012"); //1325455200 unix timestamp
于 2014-09-23T13:35:39.847 回答
4

为什么使用繁重的正则表达式,而有一个原生的DateTime PHP 类?

$value = 'badbadbad';

try {
    $datetime = new \DateTime($value);

    $value = $datetime->format('Y-m-d');
} catch(\Exception $e) {
    // Invalid date
}

如果插入了有效的日期时间字符串,则始终返回您期望的格式。

于 2017-01-19T17:18:44.203 回答
1

@baba 发布了更好的解决方案,但发布的代码在某些情况下无法正常工作。

例如,如果您尝试验证此日期“2019-12-313”;

$date = date_parse("2019-12-313");

该函数返回这个数组:

Array
(
    [year] => 2019
    [month] => 12
    [day] => 31
    [hour] => 
    [minute] => 
    [second] => 
    [fraction] => 
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 1
    [errors] => Array
        (
            [10] => Unexpected character
        )

    [is_localtime] => 
)

所以,如果你执行命令:

checkdate($date['month'], $date['day'], $date['year']);

checkdate 将返回一个真值,因为它的值$date['day']是 31 而不是 313。

为避免这种情况,您可能必须对$date['error_count']

@baba 示例已更新

$date = "2019-12-313";
$date = date_parse($date); // or date_parse_from_format("d/m/Y", $date);
if ($date['error_count'] == 0 && checkdate($date['month'], $date['day'], $date['year'])) {
    // Valid Date
}
于 2019-05-14T09:42:12.113 回答
1

您可以使用此功能检查日期:

function is_date_valid($date, $format = "Y-m-d"){
    $parsed_date = date_parse_from_format($format, $date);
    if(!$parsed_date['error_count'] && !$parsed_date['warning_count']){
        return true;
    }

    return false;
}

如何使用它:

$is_valid = is_date_valid("2021-8-1"); // it will return boolean.

注意:您可以通过在第二个参数中传递格式来更改日期的格式。

于 2021-08-13T07:39:24.027 回答
0

尝试为您的正则表达式设置开始和结束,如下所示:

$myregex = "/^\d{2}\/\d{2}\/\d{4}$/";
于 2012-12-06T15:04:23.407 回答
0

$myregex = "~^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$~";

print filter_var("bad 01/02/2012 bad",FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=> $myregex)));
于 2020-08-06T22:32:52.863 回答
-1

您收到了很多答案,表明 RegEx 将允许 99/99/9999 的答案。这可以通过向 RegEx 添加更多内容来解决。如果您知道您永远不会有 1900-2099 年之外的日期......您可以使用这样的 RegEx:

/^(0[1-9]|[12][0-9]|3[01])[/](0[1-9]|1[012])[/](19|20)\d\d$/

这将验证此格式的日期:dd/mm/YYYY

之间:01/01/1900 - 31/12/2099

如果您需要更多年,只需在接近尾声时添加它们。|21|22|23|24|25(将延长至 2599 年。)

于 2015-07-12T20:24:21.470 回答