sea - validar fecha php expresiones regulares
validaciĆ³n de fecha php (11)
Estoy tratando de configurar una validación de fecha php (MM / DD / YYYY) pero estoy teniendo problemas. Aquí hay una muestra de lo que obtuve:
$date_regex = ''%/A(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)/d/d/z%'';
$test_date = ''03/22/2010'';
if (preg_match($date_regex, $test_date,$_POST[''birthday'']) ==true) {
$errors[] = ''user name most have no spaces'';`
Úselo:
function validate_Date($mydate,$format = ''DD-MM-YYYY'') {
if ($format == ''YYYY-MM-DD'') list($year, $month, $day) = explode(''-'', $mydate);
if ($format == ''YYYY/MM/DD'') list($year, $month, $day) = explode(''/'', $mydate);
if ($format == ''YYYY.MM.DD'') list($year, $month, $day) = explode(''.'', $mydate);
if ($format == ''DD-MM-YYYY'') list($day, $month, $year) = explode(''-'', $mydate);
if ($format == ''DD/MM/YYYY'') list($day, $month, $year) = explode(''/'', $mydate);
if ($format == ''DD.MM.YYYY'') list($day, $month, $year) = explode(''.'', $mydate);
if ($format == ''MM-DD-YYYY'') list($month, $day, $year) = explode(''-'', $mydate);
if ($format == ''MM/DD/YYYY'') list($month, $day, $year) = explode(''/'', $mydate);
if ($format == ''MM.DD.YYYY'') list($month, $day, $year) = explode(''.'', $mydate);
if (is_numeric($year) && is_numeric($month) && is_numeric($day))
return checkdate($month,$day,$year);
return false;
}
Aunque la fecha de checkdate
es buena, esta función parece muy conciso para validar y también puedes dar formatos. [ Source ]
function validateDate($date, $format = ''Y-m-d H:i:s'') {
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
}
función fue copiada de esta answer o php.net
El ->format()
extra ->format()
es necesario para los casos en que la fecha no es válida, pero createFromFormat
aún logra crear un objeto DateTime. Por ejemplo:
// Gives "2016-11-10 ..." because Thursday falls on Nov 10
DateTime::createFromFormat(''D M j Y'', ''Thu Nov 9 2016'');
// false, Nov 9 is a Wednesday
validateDate(''Thu Nov 9 2016'', ''D M j Y'');
La solución de Nicolas es la mejor. Si quieres en expresiones regulares,
prueba esto,
esto validará desde el 01/01/1900 hasta el 31/12/2099 Coincide con fechas no válidas como el 31 de febrero Acepta guiones, espacios, barras diagonales y puntos como separadores de fecha
(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2}
No estoy seguro si esto responde la pregunta o si va a ayudar ...
$dt = ''6/26/1970'' ; // or // ''6.26.1970'' ;
$dt = preg_replace("([.]+)", "/", $dt);
$test_arr = explode(''/'', $dt);
if (checkdate($test_arr[0], $test_arr[1], $test_arr[2]) && preg_match("/[0-9]{1,2}//[0-9]{1,2}//[0-9]{4}/", $dt))
{ echo(date(''Y-m-d'', strtotime("$dt")) . "<br>"); }
else
{ echo "no good...format must be in mm/dd/yyyy"; }
Podemos usar el tipo de entrada simple de "fecha", como a continuación:
Birth date: <input type="date" name="userBirthDate" /><br />
Entonces podemos vincular la interfaz DateTime con la función incorporada ''explotar'':
public function validateDate()
{
$validateFlag = true;
$convertBirthDate = DateTime::createFromFormat(''Y-m-d'', $this->birthDate);
$birthDateErrors = DateTime::getLastErrors();
if ($birthDateErrors[''warning_count''] + $birthDateErrors[''error_count''] > 0)
{
$_SESSION[''wrongDateFormat''] = "The date format is wrong.";
}
else
{
$testBirthDate = explode(''-'', $this->birthDate);
if ($testBirthDate[0] < 1900)
{
$validateFlag = false;
$_SESSION[''wrongDateYear''] = "We suspect that you did not born before XX century.";
}
}
return $validateFlag;
}
Lo probé en Google Chrome e IE, todo funciona correctamente. Además, Chrome muestra una interfaz adicional simple. Si no escribe nada en la entrada o lo escribe en formato incorrecto (correctamente está siguiendo: ''1919-12-23''), obtendrá la primera declaración. Si escribe todo en un buen formato, pero escribe la fecha incorrecta (asumí que nadie podría haber nacido antes del siglo XX), su controlador enviará la segunda declaración.
Podría usar checkdate . Por ejemplo, algo como esto:
$test_date = ''03/22/2010'';
$test_arr = explode(''/'', $test_date);
if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) {
// valid date ...
}
Un enfoque más paranoico, que no cree ciegamente en la entrada:
$test_date = ''03/22/2010'';
$test_arr = explode(''/'', $test_date);
if (count($test_arr) == 3) {
if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) {
// valid date ...
} else {
// problem with dates ...
}
} else {
// problem with input ...
}
Prueba esto
/^(19[0-9]{2}|2[0-9]{3})/-(0[1-9]|1[0-2])/-(0[1-9]|1[0-9]|2[0-9]|3[0-1])((T|/s)(0[0-9]{1}|1[0-9]{1}|2[0-3]{1})/:(0[0-9]{1}|1[0-9]{1}|2[0-9]{1}|3[0-9]{1}|4[0-9]{1}|5[0-9]{1})/:(0[0-9]{1}|1[0-9]{1}|2[0-9]{1}|3[0-9]{1}|4[0-9]{1}|5[0-9]{1})((/+|/.)[/d+]{4,8})?)?$/
esta expresión regular válida para:
- 2017-01-01T00: 00: 00 + 0000
- 2017-01-01 00: 00: 00 + 00: 00
- 2017-01-01T00: 00: 00 + 00: 00
- 2017-01-01 00: 00: 00 + 0000
- 2017-01-01
Recuerde que esto cubrirá todos los casos de fecha y hora con carácter ( - )
Puede usar algunos métodos de la clase DateTime
, que pueden ser útiles; a saber, DateTime::createFromFormat()
junto con DateTime::getLastErrors()
.
$test_date = ''03/22/2010'';
$date = DateTime::createFromFormat(''m/d/Y'', $test_date);
$date_errors = DateTime::getLastErrors();
if ($date_errors[''warning_count''] + $date_errors[''error_count''] > 0) {
$errors[] = ''Some useful error message goes here.'';
}
Esto incluso nos permite ver lo que realmente causó la fecha de análisis de advertencias / errores (consulte las matrices de warnings
y errors
en $date_errors
).
REGEX debería ser un último recurso. PHP tiene algunas funciones que validarán para usted. En su caso, la fecha de verificación es la mejor opción. checkdate
Sé que esta es una publicación más antigua, pero he desarrollado la siguiente función para validar una fecha:
function IsDateTime($aDateTime) {
try {
$fTime = new DateTime($aDateTime);
$fTime->format(''m/d/Y H:i:s'');
return true;
}
catch (Exception $e) {
return false;
}
}