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 ?

2voto

Vérifier et valider YYYY-MM-DD date dans une déclaration d'une ligne

function isValidDate($date) {
    return preg_match("/^(\d{4})-(\d{1,2})-(\d{1,2})$/", $date, $m)
        ? checkdate(intval($m[2]), intval($m[3]), intval($m[1]))
        : false;
}

La sortie sera :

var_dump(isValidDate("2018-01-01")); // bool(true)
var_dump(isValidDate("2018-1-1"));   // bool(true)
var_dump(isValidDate("2018-02-28")); // bool(true)
var_dump(isValidDate("2018-02-30")); // bool(false)

Le jour et le mois sans le zéro initial sont autorisés. Si vous ne voulez pas autoriser cela, la regexp doit être :

"/^(\d{4})-(\d{2})-(\d{2})$/"

2voto

Parvez Alam Points 12

Je cherchais "comment valider une date" et j'ai trouvé cette solution. Elle est ancienne mais je vais partager la méthode ci-dessous qui peut être utilisée pour valider une date en php,

checkdate('01', '31', '2019')

2voto

webcoder.eu Points 1

Le code ci-dessous garantit l'utilisation des chiffres AAAA(1900-2099)-MM(01-12)-DD(01-31) et utilise la fonction checkdate() pour vérifier l'exactitude de la date, par exemple le 29 février :

$date_pattern = '/^(19|20)\d{2}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])$/';

if (empty($date) || (!preg_match("$date_pattern", $date, $m) || (!checkdate($m[2], $m[3], $m[1])))) {
    $echo 'Invalid Start date e.g. YYYY-MM-DD';
}

Pour modifier les modèles de date et l'intervalle d'année :

// modèle DD/MM/YYYY où DD (01-31), MM (01-12) et YYYY (1950-2099) & doivent être des chiffres - remplacer checkdate () par !checkdate($m[2], $m[1], $m[3]

// Pour étendre la plage d'années, par exemple 1900-2099 /^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/(19|20) \d {2}$/ - remplacer checkdate () par !checkdate($m[2], $m[1], $m[3]

1voto

Ariaan Points 688

Tout dépend de la rigueur que vous souhaitez donner à cette fonction. Par exemple, si vous ne voulez pas autoriser les mois au-dessus de 12 et les jours au-dessus de 31 (pas en fonction du mois, cela nécessiterait d'écrire une logique de date), cela pourrait devenir assez compliqué :

function checkDate($date)
{
  $regex = '/^' . 
    '(' .

    // Allows years 0000-9999
    '(?:[0-9]{4})' .
    '\-' .

    // Allows 01-12
    '(?:' .
    '(?:01)|(?:02)|(?:03)|(?:04)|(?:05)|(?:06)|(?:07)|(?:08)|(?:09)|(?:10)|' .
    '(?:11)|(?:12)' .
    ')' .
    '\-' .

    // Allows 01-31
    '(?:' .
    '(?:01)|(?:02)|(?:03)|(?:04)|(?:05)|(?:06)|(?:07)|(?:08)|(?:09)|(?:10)|' .
    '(?:11)|(?:12)|(?:13)|(?:14)|(?:15)|(?:16)|(?:17)|(?:18)|(?:19)|(?:20)|' .
    '(?:21)|(?:22)|(?:23)|(?:24)|(?:25)|(?:26)|(?:27)|(?:28)|(?:29)|(?:30)|' .
    '(?:31)' .
    ')' .

    '$/';

  if ( preg_match($regex, $date) ) {
    return true;
  }

  return false;
}

$result = checkDate('2012-09-12');

Personnellement, j'opterais pour : /^([0-9]{4}\-([0-9]{2}\-[0-9]{2})$/

1voto

Pratik Soni Points 1

Pour travailler avec des dates en php, vous devez suivre le standard php. La regex donnée vous assurera que vous avez une date valide qui peut fonctionner avec PHP.

    preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)

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