Esta reseña ha sido probado por nuestros especialistas así se garantiza la veracidad de esta sección.
Solución:
Prueba esto.
$date="2012-09-12";
if (preg_match("/^[0-9]4-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date))
return true;
else
return false;
Probablemente sea mejor usar otro mecanismo para esto.
La solución moderna, con DateTime
:
$dt = DateTime::createFromFormat("Y-m-d", $date);
return $dt !== false && !array_sum($dt::getLastErrors());
Esto valida la entrada también: $dt !== false
asegura que la fecha se puede analizar con el formato especificado y el array_sum
truco es una forma concisa de asegurarse de que PHP no hizo “cambio de mes” (por ejemplo, considere que el 32 de enero es el 1 de febrero). Ver DateTime::getLastErrors()
para más información.
Solución de la vieja escuela con explode
y checkdate
:
list($y, $m, $d) = array_pad(explode('-', $date, 3), 3, 0);
return ctype_digit("$y$m$d") && checkdate($m, $d, $y);
Esto valida que la entrada también sea una fecha válida. Puede hacerlo con una expresión regular, por supuesto, pero será más complicado, y el 29 de febrero no se puede validar con una expresión regular.
El inconveniente de este enfoque es que debe tener mucho cuidado para rechazar todas las posibles entradas “malas” sin emitir un aviso bajo ninguna circunstancia. Así es cómo:
explode
está limitado a devolver 3 tokens (de modo que si la entrada es “1-2-3-4”,$d
se convertirá en “3-4”)ctype_digit
se usa para asegurarse de que la entrada no contenga ningún carácter no numérico (aparte de los guiones)array_pad
se utiliza (con un valor predeterminado que hará quecheckdate
para fallar) para asegurarse de que se devuelvan suficientes elementos para que si la entrada es “1-2”list()
no emitirá un aviso
aaaa-mm-dd :/^((((19|[2-9]d)d2)-(0[13578]|1[02])-(0[1-9]|[12]d|3[01]))|(((19|[2-9]d)d2)-(0[13456789]|1[012])-(0[1-9]|[12]d|30))|(((19|[2-9]d)d2)-02-(0[1-9]|1d|2[0-8]))|(((1[6-9]|[2-9]d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-02-29))$/g
aaaa/mm/dd :/^((((19|[2-9]d)d2)/(0[13578]|1[02])/(0[1-9]|[12]d|3[01]))|(((19|[2-9]d)d2)/(0[13456789]|1[012])/(0[1-9]|[12]d|30))|(((19|[2-9]d)d2)/02/(0[1-9]|1d|2[0-8]))|(((1[6-9]|[2-9]d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))/02/29))$/g
mm-dd-aaaa :/^(((0[13578]|1[02])-(0[1-9]|[12]d|3[01])-((19|[2-9]d)d2))|((0[13456789]|1[012])-(0[1-9]|[12]d|30)-((19|[2-9]d)d2))|(02-(0[1-9]|1d|2[0-8])-((19|[2-9]d)d2))|(02-29-((1[6-9]|[2-9]d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
mm/dd/aaaa:/^(((0[13578]|1[02])/(0[1-9]|[12]d|3[01])/((19|[2-9]d)d2))|((0[13456789]|1[012])/(0[1-9]|[12]d|30)/((19|[2-9]d)d2))|(02/(0[1-9]|1d|2[0-8])/((19|[2-9]d)d2))|(02/29/((1[6-9]|[2-9]d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
dd/mm/aaaa :/^(((0[1-9]|[12]d|3[01])/(0[13578]|1[02])/((19|[2-9]d)d2))|((0[1-9]|[12]d|30)/(0[13456789]|1[012])/((19|[2-9]d)d2))|((0[1-9]|1d|2[0-8])/02/((19|[2-9]d)d2))|(29/02/((1[6-9]|[2-9]d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
dd-mm-aaaa :/^(((0[1-9]|[12]d|3[01])-(0[13578]|1[02])-((19|[2-9]d)d2))|((0[1-9]|[12]d|30)-(0[13456789]|1[012])-((19|[2-9]d)d2))|((0[1-9]|1d|2[0-8])-02-((19|[2-9]d)d2))|(29-02-((1[6-9]|[2-9]d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g