J'essaie de vérifier que les dates saisies par les utilisateurs finaux sont dans le AAAA-MM-JJ. Regex n'a jamais été mon point fort, j'obtiens toujours une fausse valeur de retour pour le preg_match () que j'ai configuré.
Donc, je suppose que j'ai fait un gâchis de l'expression régulière, détaillé 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 pensées?
php
regex
date-format
cosmique
la source
la source
date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12";
ou PHPcheckdate ( int $month , int $day , int $year )
.Réponses:
Essaye ça.
la source
return (bool)preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date);
Il est probablement préférable d'utiliser un autre mécanisme pour cela.
La solution moderne, avec
DateTime
:Cela valide aussi l'entrée:
$dt !== false
garantit que la date peut être analysée avec le format spécifié et l'array_sum
astuce est un moyen laconique de s'assurer que PHP n'a pas fait de "décalage de mois" (par exemple, considérez que le 32 janvier est le 1er février). VoirDateTime::getLastErrors()
pour plus d'informations.Solution old-school avec
explode
etcheckdate
:Cela confirme que l'entrée est également une date valide. Vous pouvez le faire avec une regex bien sûr, mais ça va être plus compliqué - et le 29 février ne peut pas du tout être validé avec une regex.
L'inconvénient de cette approche est qu'il faut être très prudent pour rejeter toutes les «mauvaises» entrées possibles sans émettre d'avis en aucune circonstance. Voici comment:
explode
est limité à renvoyer 3 jetons (de sorte que si l'entrée est "1-2-3-4",$d
deviendra "3-4")ctype_digit
est utilisé pour s'assurer que l'entrée ne contient pas de caractères non numériques (à l'exception des tirets)array_pad
est utilisé (avec une valeur par défaut qui entraînera l'checkdate
échec) pour s'assurer que suffisamment d'éléments sont renvoyés pour que si l'entrée est "1-2"list()
n'émette pas de notificationla source
DateTime
et jamais entendu parlercheckdate
... honte à moi.DateTime
peut également le faire. Je viens juste de terminer la réponse, jetez un œil à nouveau si vous le souhaitez.getLastErrors
?aaaa-mm-jj:
/^((((19|[2-9]\d)\d{2})\-(0[13578]|1[02])\-(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\-(0[13456789]|1[012])\-(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\-02\-(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\-02\-29))$/g
aaaa / mm / jj:
/^((((19|[2-9]\d)\d{2})\/(0[13578]|1[02])\/(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\/(0[13456789]|1[012])\/(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\/02\/(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\/02\/29))$/g
mm-jj-aaaa:
/^(((0[13578]|1[02])\-(0[1-9]|[12]\d|3[01])\-((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\-(0[1-9]|[12]\d|30)\-((19|[2-9]\d)\d{2}))|(02\-(0[1-9]|1\d|2[0-8])\-((19|[2-9]\d)\d{2}))|(02\-29\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
mm / jj / aaaa:
/^(((0[13578]|1[02])\/(0[1-9]|[12]\d|3[01])\/((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\/(0[1-9]|[12]\d|30)\/((19|[2-9]\d)\d{2}))|(02\/(0[1-9]|1\d|2[0-8])\/((19|[2-9]\d)\d{2}))|(02\/29\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
jj / mm / aaaa:
/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
jj-mm-aaaa:
/^(((0[1-9]|[12]\d|3[01])\-(0[13578]|1[02])\-((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\-(0[13456789]|1[012])\-((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\-02\-((19|[2-9]\d)\d{2}))|(29\-02\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
la source
Critères:
Chaque année divisible par 4 est une année bissextile, sauf lorsqu'elle est divisible par 100 à moins qu'elle ne soit divisible par 400. Donc:
Février a 29 jours dans une année bissextile et 28 jours si ce n'est pas une année bissextile
30 jours en avril, juin, septembre et novembre
31 jours en janvier, mars, mai, juillet, août, octobre et décembre
Tester:
Les dates suivantes devraient toutes passer la validation:
Les dates suivantes devraient toutes échouer à la validation:
Intervalle:
Nous allons tester les dates du 1er janvier 1000 au 31 décembre 2999. Techniquement, le calendrier grégorien actuellement utilisé n'est entré en vigueur qu'en 1753 pour l'Empire britannique et à diverses années dans les années 1600 pour les pays d'Europe, mais je ne vais pas inquiétez-vous à ce sujet.
Regex à tester pour une année bissextile:
Les années divisibles par 400:
Les années divisibles par 4:
Les années divisibles par 100:
Non divisible par 100:
Les années divisibles par 100 mais pas par 400:
Divisible par 4 mais pas par 100:
Les années bissextiles:
Non divisible par 4:
Pas une année bissextile:
Mois et jour valides hors février (MM-JJ):
Février avec 28 jours:
Février avec 29 jours:
Date valide:
Voilà donc une expression régulière pour les dates entre le 1er janvier 1000 et le 31 décembre 2999 au format AAAA-MM-JJ.
Je soupçonne que cela peut être raccourci un peu, mais je laisse cela à quelqu'un d'autre.
Cela correspondra à toutes les dates valides. Si vous voulez qu'il ne soit valide que lorsqu'il ne contient qu'une seule date et rien d'autre, enveloppez-le
^( )$
comme suit:Si vous le souhaitez pour une entrée de date facultative (c'est-à-dire qu'il peut être vide ou une date valide), ajoutez
^$|
au début, comme ceci:la source
Vous pouvez le faire de cette façon:
mais vous feriez mieux d'utiliser celui-ci:
dans ce cas, vous obtiendrez un objet plus facile à utiliser que de simples chaînes.
la source
0175-44-19927
passera.Je sais que c'est une vieille question. Mais je pense avoir une bonne solution.
Tu peux l'essayer. Si vous modifiez la date au 21.02.2016, l'écho est faux. Et si vous changez le format après cela en dmY, l'écho est vrai.
Avec ce code simple, vous devriez être en mesure de vérifier quel format de date est utilisé sans le vérifier par le regex.
Peut-être qu'il y a une personne qui le testera sur chaque cas. Mais je pense que mon idée est généralement valable. Pour moi, cela semble logique.
la source
Vous pouvez utiliser un preg_match avec une fonction php checkdate
la source
preg_match a besoin d'un / ou d'un autre caractère comme délimiteur.
vous devriez également vérifier la validité de cette date pour ne pas vous retrouver avec quelque chose comme 9999-19-38
la source
Vous pouvez également le faire comme ceci:
Cela vérifiera non seulement le format, mais également la validité de la date auto, car
DateTime
ne créera que des dates valides et cela doit correspondre à l'entrée.la source
vous pouvez utiliser
la source
Vérifier et valider la
YYYY-MM-DD
date en une seule ligneLa sortie sera:
Le jour et le mois sans zéro non significatif sont autorisés. Si vous ne souhaitez pas autoriser cela, l'expression rationnelle doit être:
la source
Si vous souhaitez faire correspondre ce type de date, utilisez:
la source
Cela devrait vous dire si le format est valide et si la date d'entrée est valide.
la source
Si cela vous aide, voici une expression régulière pour le format jnY (l'année doit être supérieure à 2018):
la source
la source
Probablement utile à quelqu'un:
la source
'1996-11-31 24:00'); // true
, vraiment? De plus, il y a parfois 61 secondes dans une minute, voir: en.wikipedia.org/wiki/Leap_secondFonction pour valider le format de date générique:
Exemple d'exécution:
la source
Tout dépend de la rigueur de 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é:
Personnellement, j'irais simplement pour:
/^([0-9]{4}\-([0-9]{2}\-[0-9]{2})$/
la source
0[1-9]|1[0-2]
correspond au mois 01-12 et aux0[1-9]|[12][0-9]|3[01]
jours 01-31.Pour travailler avec des dates en php, vous devez suivre le standard php afin que le regex donné garantisse que vous avez une date valide qui peut fonctionner avec PHP.
la source
1980-01-01
mais correspondra2100-02-29
Cette méthode peut être utile pour valider la date en PHP. La méthode actuelle est pour le format mm / jj / aaaa. Vous devez mettre à jour la séquence de paramètres dans la date de contrôle selon votre format et le délimiteur dans éclaté .
la source
[Si vous utilisez Symfony 4.1.2, essayez ceci] [1]
la source
À partir de Laravel 5.7 et format de date, par exemple: 31/12/2019
la source
Je cherchais "comment valider la date" et j'ai trouvé cette solution, son ancienne mais je partagerai ci-dessous la méthode qui peut être utilisée pour valider la date en php,
la source