使用filter_var()来验证日期?

时间:2012-12-06 14:59:57

标签: php filtering

我显然没有正确使用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)));

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

谢谢。

8 个答案:

答案 0 :(得分:22)

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

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
}

答案 1 :(得分:16)

$myregex = '~^\d{2}/\d{2}/\d{4}$~';

正则表达式匹配是因为您只需要字符串中的 where 模式。你想要的只是 那个模式而不是别的。因此,请添加^$

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

if (!DateTime::createFromFormat('d/m/Y', $string))

答案 2 :(得分:3)

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

strtotime("bad 01/02/2012 bad"); //false
strtotime("01/02/2012"); //1325455200 unix timestamp

答案 3 :(得分:1)

为什么使用繁重的RegEx,而有一个本地DateTime PHP类?

$value = 'badbadbad';

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

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

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

答案 4 :(得分:0)

尝试设置正则表达式的开头和结尾:

$myregex = "/^\d{2}\/\d{2}\/\d{4}$/";

答案 5 :(得分:0)

@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
}

答案 6 :(得分:0)

"scripts": {
        "start:development": "webpack-dev-server --open --mode development --define process.env.BASE_API='\"https:// 123.456'",
        "start": "webpack-dev-server --open --mode development --define process.env.BASE_API='\"https://site\"'",
    }

答案 7 :(得分:-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年。)