来自“Murach的PHP”的正则表达式生日日期验证

时间:2014-05-06 20:30:59

标签: php regex

我想确保输入的生日不再存在。如果我输入未来日期,则应显示错误消息。

public function birth($name, $value) {
    $datePattern = '/^[0-9]{2}\/[1-9]{2}\/[1-9]{4}?$/';
    $match = preg_match($datePattern, $value);
    if ( $match === false ) {
        $field->setErrorMessage('Error testing field.');
       return;
    }
    if ( $match != 1 ) {
        $field->setErrorMessage('Invalid date format.');
        return;        
    }
    $dateParts = explode('/', $value);// i try to see if i could take everything after / to form an array 
    $month = $dateParts[0];
    $day  = $dateParts[1];
    $year  = $dateParts[2];
    $dateString = $month . $day . $year;
    $exp = new \DateTime($dateString);
    $now = new \DateTime();
    if ( $exp < $now ) {
        $field->setErrorMessage('Cant be a date after the current date');
        return;
    }

    $field->clearErrorMessage();
}

然而,它无法正常工作。我无法将$dateStringDateTime

进行比较

1 个答案:

答案 0 :(得分:3)

您不需要正则表达式 - 只需将其与当前日期进行比较。

public function birth($name, $value) {
    $timestamp = strtotime($value);
    if ($timestamp === FALSE) {
        // $value is not a valid date
    }
    if ($timestamp > time()) {
        // date is in the future
    }
}

但是,如果您想保留当前代码,则问题出在此行

$dateString = $month . $day . $year;

这不是有效的日期表示。今天是572014 - 您需要在其间添加/并且它会起作用。

$dateString = sprintf("%u/%u/%u", $month, $day, $year);