web-dev-qa-db-fra.com

Qu'est-ce que l'expression régulière MM/JJ/AAAA et comment l'utiliser en php?

J'ai trouvé l'expression régulière pour MM/JJ/AAAA à http://www.regular-expressions.info/regexbuddy/datemmddyyyy.html mais je ne pense pas l'utiliser correctement.

Voici mon code:

$date_regex = '(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d';

$test_date = '03/22/2010';
if(preg_match($date_regex, $test_date)) {
  echo 'this date is formatted correctly';  
} else {
  echo 'this date is not formatted correctly';  
}

Quand j'exécute ceci, il rappelle encore "cette date n'est pas formatée correctement", alors que cela devrait être le contraire. Comment définir cette expression régulière en php?

22
zeckdude

Le problème est celui des délimètres et des caractères échappés (comme d'autres l'ont mentionné). Cela fonctionnera:

$date_regex = '/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/';

$test_date = '03/22/2010';
if(preg_match($date_regex, $test_date)) {
  echo 'this date is formatted correctly';
} else {
  echo 'this date is not formatted correctly';
}

Notez que j'ai ajouté une barre oblique au début et à la fin de l'expression et que j'ai échappé (avec une barre oblique inverse) les barres obliques du modèle.

Pour aller un peu plus loin, ce modèle ne permet pas d'extraire correctement l'année, mais seulement le siècle. Vous devrez le changer en /(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)/ et (comme Jan l'a souligné ci-dessous) si vous voulez vous assurer que toute la chaîne correspond (au lieu d'un sous-ensemble), vous voudrez utiliser quelque chose de plus semblable à /^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)$/.


Comme d'autres l'ont mentionné, strtotime () pourrait être une meilleure option si vous essayez simplement de sortir la date. Il peut analyser presque tous les formats couramment utilisés et vous donnera un timestamp Unix. Vous pouvez l'utiliser comme ceci:

$test_date = '03/22/2010';

// get the unix timestamp for the date
$timestamp = strtorime($test_date);

// now you can get the date fields back out with one of the normal date/time functions. example:
$date_array = getdate($timestamp);
echo 'the month is: ' . $date_array['month'];    
44
Jeremy Logan

Il est probablement préférable d’utiliser strtotime (), qui convertira presque tous les formats de date lisibles par un humain en un horodatage Unix. - http://php.net/manual/en/function.strtotime.php

5
DCD

Vous avez besoin de corriger les délimiteurs autour du motif.

$date_regex = '~(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d~';
5
fuxia

vous pouvez également utiliser la fonction checkdate () . Pas besoin de regex.

$str="03/22/2010";
list($mth,$day,$yr)=explode("/",$str);
var_dump(checkdate($mth,$day,$yr));
3
ghostdog74

La regex de l'auteur de la question est presque correcte. La date n'est pas validée car un motif doit être:

  pattern="^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|20)\d\d$"

ou si vous avez envie de:

  pattern="^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"

Veuillez noter que ce modèle vérifie uniquement le format d'une date et les valeurs max/min pour des éléments de date individuels. Cela signifie que l'entrée d'un utilisateur doit être vérifiée pour la validité de la date dans la fonction JavaScript et/ou un serveur (par exemple, le 29 février ne devrait pas être autorisé si une année n'est pas une année bissextile).

En remarque, si vous souhaitez autoriser un seul chiffre (par exemple pour un mois), modifiez une partie de mois en 

([0-9]|0[1-9]|1[012])

Explication:
[0-9] - chiffre unique compris entre 0 et 9
ou
0 [1-9] - deux chiffres entre 01 et 09
ou
1 [012] - deux chiffres limités à 10, 11, 12

2
azakgaim

Ceci vérifie les dates valides de MM/DD/1960 à MM/DD/2014

Accepte également les dates telles que M/D/YYYY et 0M/0D/YYYY 

^(?:[1-9]|0[1-9]|1[0-2])/(?:[0-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])/(?:20[6-9][0-9]|20[0-1][0-4])$
1
user1494459

Pour utiliser cette expression rationnelle pour valider les dates dans le code PHP, vous devez la formater correctement en tant que chaîne avec des délimiteurs de regex supplémentaires, comme l'exigent les fonctions PHP. Vous devez également ajouter des ancres pour forcer l'expression rationnelle à correspondre à la chaîne entière (sinon, ne pas correspondre):

$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)) { 
  echo 'this date is formatted correctly';   
} else { 
  echo 'this date is not formatted correctly';   
} 

Bien sûr, un appel à la bibliothèque serait préférable dans cette situation. L'expression régulière autorise les dates non valides telles que le 31 février.

Le regex peut être utile si vous souhaitez analyser une chaîne pour les dates. Dans ce cas, vous n'avez pas besoin des ancres. Vous aurez peut-être encore besoin d'un contrôle supplémentaire pour exclure les dates non valides. Cela dépend si votre entrée est connue pour ne contenir que des dates valides ou non.

1
Jan Goyvaerts

String timeStamp = "03/11/2018 17:51:45";

motif statique privé TIMESTAMP_PATTERN = Motif.compile ("(0? [1-9] | 1 [012])/0 ([9]] | [1-2] [0-9] | 3 [0-1 ])/" +" ([1-9] [0-9] {3}) ([0-1]? [0-9] | 2 [0-3]): ([0-5 ]? [0-9]): ([0-5]? [0-9]) ");

private static boolean isTimeStampValid(String timeStamp) {
        boolean isFeb = timeStamp.split("/")[0].matches("(0?[2])");
        if (isFeb) {
            boolean isValidFebDate = timeStamp.split("/")[1].matches("(0?[1-9]|1[1-9]|2[0-8])");
            if (!isValidFebDate) return false;
        }
        return TIMESTAMP_PATTERN.matcher(timeStamp).matches();
    }
0
Yoga Gowda