130 votes

PHP Regex pour vérifier que la date est au format AAAA-MM-JJ

J'essaie de vérifier que les dates saisies par les utilisateurs finaux sont dans le format AAAA-MM-JJ. Les Regex n'ont jamais été mon point fort, je continue à obtenir une fausse valeur de retour pour le preg_match() que j'ai configuré.

Je suppose donc que j'ai fait une erreur dans l'expression rationnelle, détaillée ci-dessous.

$date="2012-09-12";

if (preg_match("^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$",$date))
    {
        return true;
    }else{
        return false;
    }

Des idées ?

1voto

Filip Points 11

Si cela peut vous aider, voici une regex pour le format j-n-Y (l'année doit être supérieure à 2018) :

if (preg_match('/^([1-9]|[1-2][0-9]|[3][0-1])\-([1-9]|[1][0-2])\-(?:20)([1][8-9]|[2-9][0-9])$/', $date)) {
   // Do stuff
}

1voto

Mexidense Points 11

À partir de Laravel 5.7 et du format de date, c'est-à-dire : 31/12/2019

function checkDateFormat(string $date): bool
{
    return preg_match("/^(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])\/[0-9]{4}$/", $date);
}

0voto

Amit Garg Points 1273

Cette méthode peut être utile pour valider une date en PHP. La méthode actuelle est pour le format mm/dd/yyyy. Vous devez mettre à jour la séquence des paramètres dans date de contrôle selon votre format et le délimiteur dans exploser .

    function isValidDate($dt)
    {
        $dtArr = explode('/', $dt);
        if (!empty($dtArr[0]) && !empty($dtArr[1]) && !empty($dtArr[2])) {
            return checkdate((int) $dtArr[0], (int) $dtArr[1], (int) $dtArr[2]);
        } else {
            return false;
        }
    }

0voto

DIDIT B Points 1

[Si vous utilisez Symfony 4.1.2, essayez ceci] [1]

  $validDate = explode("-",$request->get('date'));
        if (checkdate(filter_var($validDate[1],FILTER_SANITIZE_NUMBER_INT),filter_var($validDate[0],FILTER_SANITIZE_NUMBER_INT),filter_var($validDate[2],FILTER_SANITIZE_NUMBER_INT))){
            $date = date_create(filter_var($request->get('date'),FILTER_SANITIZE_SPECIAL_CHARS));
        }else{
            return $this->redirectToRoute('YOUR_ROUTE');
        }

0voto

ahmad shorif Points 1

Un modèle plus pragmatique pourrait être le suivant

$date="2012-09-12";

if (preg_match("/^(20[0-9]{2})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)) {
    return true;
} else {
    return false;
}

Ce qui empêchera de mettre 9999-09-12 de telles valeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X