Ich nochmal ...
/// Rückgabe im Fehlerfall: FALSE;
/// Rückgabe im Erfolgsfall: ARRAY ($day_of_month, $month, $year)
function date_check(
$dmy // dom-month-year, format: DD.MM.YYYY
) {
if ( !preg_match('/\A([0-9]{1,2})[\-.]([0-9]{1,2})[\-.]([0-9]{4})\z/', trim($dmy), $dmy_array) ) {
return FALSE;
}
$year = intval( $dmy_array[3], 10 );
$month = intval( $dmy_array[2], 10 );
$dom = intval( $dmy_array[1], 10 );
if ( !checkdate($month, $dom, $year) ) {
return FALSE;
}
return array ($dom, $month, $year);
}
Das sieht tatsächlich kürzer aus als die umständliche (und korrigierte Variante) Variante von mir:
/// Rückgabe im Fehlerfall: FALSE;
/// Rückgabe im Erfolgsfall: ARRAY ($day_of_month, $month, $year)
function date_check_input(
$dmy // dom-month-year, format: DD-MM-YYYY
) {
// Eingabeformat prüfen
if ( !preg_match('/\A([0-9]{1,2})[\-.]([0-9]{1,2})[\-.]([0-9]{4})\z/', trim($dmy), $dmy_array) ) {
return FALSE;
}
// Zeichenketten in Zahlen umwandeln
$year = intval( $dmy_array[3], 10 );
$month = intval( $dmy_array[2], 10 );
$dom = intval( $dmy_array[1], 10 );
// gültiges Jahr?
if ($year < 1583) {
return FALSE;
}
// gültiger Monat?
if ($month < 1 || $month > 12) {
return FALSE;
}
// gültiger Tag im Monat? ... etwas komplizierter ;-)
if ( in_array( $month, array (4,6,9,11), TRUE ) ) {
$days_in_month = 30;
}
// hier stand vorher fälschlicherweise $dom statt $month
elseif(2 === $month) {
if (0 != $year % 4) $days_in_month = 28;
if (0 != $year % 100) $days_in_month = 29;
if (0 == $year % 400) $days_in_month = 29;
else $days_in_month = 28;
}
else {
$days_in_month = 31;
}
if ($dom < 1 || $dom > $days_in_month) {
return FALSE;
}
return array ($dom, $month, $year);
}
... ist zwar länger (und umständlicher) aber pädagogisch wertvoller. ;-) Und wer es ganz genau nimmt, kann die Funktion so umbauen, dass sie mitteilt, in welchem Teil (Tag, Monat, Jahr) des eingegebenen Datums der Fehler steckte.
MffG
EisFuX