使用filter_var()来验证日期?

Gul*_*har 10 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)));
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Bab*_*aba 23

使用正则表达式来验证日期是一个坏主意..试想一下,99/99/9999可以很容易地被看作是一个有效的日期..你应该了checkdate

bool checkdate ( int $month , int $day , int $year )
Run Code Online (Sandbox Code Playgroud)

简单用法

$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
}
Run Code Online (Sandbox Code Playgroud)

  • **注意** 如果您执行 `date_parse( '2019-02-313' );` ,结果会将 `31` 作为日期值。也许在这种情况下您需要检查字段 `$date['error_count']` 的值 (2认同)

dec*_*eze 16

$myregex = '~^\d{2}/\d{2}/\d{4}$~';
Run Code Online (Sandbox Code Playgroud)

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

请注意,这仍然不意味着该值是有效日期.99/99/9999将通过该测试.我用的是:

if (!DateTime::createFromFormat('d/m/Y', $string))
Run Code Online (Sandbox Code Playgroud)

  • 根据我的测试,你的`createFromFormat()`条件不会捕获像`99/99/9999`这样的字符串.它会抓住`baddate`. (2认同)

Cmy*_*ker 6

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

strtotime("bad 01/02/2012 bad"); //false
strtotime("01/02/2012"); //1325455200 unix timestamp
Run Code Online (Sandbox Code Playgroud)


Tim*_*Tim 5

为什么要使用繁重的 RegEx,而有一个原生的DateTime PHP 类?

$value = 'badbadbad';

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

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

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