Je suis en train d'essayer de configurer une validation de date php (MM/JJ/AAAA) mais j'ai des problèmes Voici un échantillon de ce que j'ai eu:
$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';`
Vous pouvez utiliser checkdate . Par exemple, quelque chose comme ceci:
$test_date = '03/22/2010';
$test_arr = explode('/', $test_date);
if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) {
// valid date ...
}
Une approche plus paranoïaque, qui ne croit pas aveuglément l’entrée:
$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 ...
}
Vous pouvez utiliser certaines méthodes de la classe DateTime
, qui pourraient être pratiques; à savoir, DateTime::createFromFormat()
en conjonction avec 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.';
}
Cela nous permet même de voir la cause réelle des avertissements/erreurs d'analyse de la date (regardez les tableaux warnings
et errors
dans $date_errors
).
Bien que checkdate
soit bon, cela semble être une fonction très concise à valider et vous pouvez également donner des formats. [ La source ]
function validateDate($date, $format = 'Y-m-d H:i:s') {
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
}
function a été copié à partir de cette réponse ou php.net
La ->format()
supplémentaire est nécessaire dans les cas où la date est invalide mais que createFromFormat
parvient toujours à créer un objet DateTime. Par exemple:
// 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 solution de Nicolas est la meilleure. Si vous voulez en regex,
essaye ça,
correspond aux dates invalides telles que le 31 février Accepte les tirets, les espaces, les barres obliques et les points comme séparateurs de date
(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2}
REGEX devrait être un dernier recours. PHP a quelques fonctions qui valideront pour vous. Dans votre cas, le checkdate est la meilleure option. http://php.net/manual/en/function.checkdate.php
Utilise le:
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;
}
Je sais que ceci est un ancien billet, mais j'ai développé la fonction suivante pour valider une date
function IsDateTime($aDateTime) {
try {
$fTime = new DateTime($aDateTime);
$fTime->format('m/d/Y H:i:s');
return true;
}
catch (Exception $e) {
return false;
}
}
Je ne sais pas si cela répond à la question ou si cela va aider ...
$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"; }
Nous pouvons utiliser un type d'entrée simple "date", comme ci-dessous:
Birth date: <input type="date" name="userBirthDate" /><br />
Ensuite, nous pouvons relier l’interface DateTime à la fonction intégrée «exploser»:
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;
}
Je l'ai testé sur Google Chrome et IE, tout fonctionne correctement. De plus, Chrome affiche une interface supplémentaire simple. Si vous n'écrivez rien en entrée ou si vous ne l'écrivez pas au mauvais format (le message correct suit: '1919-12-23'), vous obtiendrez la première déclaration. Si vous écrivez tout dans un bon format, mais que vous tapez une mauvaise date (j'ai supposé que personne ne pourrait naître avant le XX siècle), votre contrôleur enverra le deuxième relevé.
Essaye ça
/^(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})?)?$/
cette expression régulière valide pour:
N'oubliez pas que cela couvrira tous les cas de date et heure avec caractère ( - )