Regex valider corriger ISO8601 chaîne de date avec le temps
Par exemple: 2015-01-17T18:23:02+00:00
Avoir quelques ennuis avec la regex que certains composants de la chaîne pour être considéré comme "valide" sont spéculé et ne peut pas être exigé.
Aussi le fait que la chaîne peut être au format: 2015-01-17T18:23:02Z
est en me jetant légèrement
Merci d'avance les gars.
La langue que vous parlez?
comment est-ce que votre actuelle regex?
Regex pourrait être utilisé pour valider le format de la date, mais vous ne pourrez pas sémantiquement valider la date. Imaginez une expression régulière qui correspond à 1000-02-30T00:00:00+00:00
PHP; je suis dans le train Jens; même si c'est loin d'être terminée, je suis juste avoir de la difficulté à obtenir ma tête autour de l'alternative des chaînes, si vous pourriez peut-être m'expliquer qui pourrait l'aider?
Je ne suis pas embêté du tout si il valide la date elle-même, juste le format ^^
comment est-ce que votre actuelle regex?
Regex pourrait être utilisé pour valider le format de la date, mais vous ne pourrez pas sémantiquement valider la date. Imaginez une expression régulière qui correspond à 1000-02-30T00:00:00+00:00
PHP; je suis dans le train Jens; même si c'est loin d'être terminée, je suis juste avoir de la difficulté à obtenir ma tête autour de l'alternative des chaînes, si vous pourriez peut-être m'expliquer qui pourrait l'aider?
Je ne suis pas embêté du tout si il valide la date elle-même, juste le format ^^
OriginalL'auteur Jack hardcastle | 2015-01-19
Vous devez vous connecter pour publier un commentaire.
Basée sur une auparavant répondre de la mine, vous pouvez faire cela et être vachement strict:
Debuggex Démo
Légèrement monstrueux, mais il vérifie les dates de validité, y compris l'année bissextile (Proleptic Grégorien), fonctionne depuis des années 1000-9999, les vérifications pour les invalides des moments comme 25:30 ou 21:94 et un maximum UTC offset de +/-19:59 (ou Z).
(à droite maintenant plus de +14:00 ou -12:00 ne pas se produire, mais il pourrait à l'avenir).
Pour la fin: Cette réponse prend en charge uniquement un sous-ensemble de la norme ISO8601 basé sur les exemples de l'OP a donné. Qui est la prolongation de la notation avec les secondes dans la section heure et les minutes dans le décalage UTC. Par souci de concision, il ne pas de soutien de base de la notation où les tirets et les deux-points sont omis, ou l'omission de minutes dans le décalage UTC ou l'unité la plus petite. Ni est-il un soutien pour ordinale dates (jour de l'année) ou de l'année-week-dayofweek notations.
Une version étendue de l'expression rationnelle qui prend en charge la base de la notation, ordinale et l'omission de secondes /UTC offset minutes de vie ici.
Je ne sais pas si nanosecondes/fraction de secondes sont nécessaires dans la norme iso 8601 offset format datetime, mais cette expression n'a pas de signal, que ce datetime est valide: 2017-02-17T10:12:56.000008765+01:00
Ce qui a fonctionné pour moi avec des fractions de seconde: ^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29/30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+|.{0})(?:Z|[+-][01]\d:[0-5]\d)$
Ceux-ci sont valables ISO8601: 20170604T0000Z, 2017060T0000Z
vrai, mais en dehors de la portée de cette réponse. Votre 2ème exemple ressemble à une faute de le 1er, donc je me décourager quiconque d'accepter qu'à moins de vraiment savoir ce qu'ils font. Vous pouvez étendre ma réponse comme donc, mais il présente des imperfections. Dans cette version, vous pouvez avoir des connaissances de base date avec de temps prolongée qui n'est pas autorisé. La résolution qui permettrait de doubler la taille de la regex et puis vous n'avez pas comptabilisés pour le bon
year-week-dayofweek
notations etc. C'est une petite réponse pour une portée limitée et doit être traitée comme telle 🙂OriginalL'auteur funkwurm
Fondé sur le précédent réponse, cette regex poignées de la fraction de secondes.
Debuggex Démo
OriginalL'auteur Nicolas Henneaux
Si vous voulez juste pour correspondre fuseaux horaires de l'utilisation de ce:
Le max est de + ou - 19:59, ce qui est suffisant
OriginalL'auteur nfgallimore
Dans ce lien nous voyons les différentes ISO 8601 formats basés sur des valeurs différentes, nous aimerions inclure.
Pour l'exemple en question,
2015-01-17T18:23:02+00:00
, ci-dessous regex devrait fonctionner.[0-9]{4}-[0-9]{2}-[0-9]{2}T([0-9]{2}:){2}[0-9]{2}[+|-][0-9]{2}:[0-9]{2}
Ici
[+|-]
est pour d'éventuels décalages de fuseau horaire.OriginalL'auteur Shree Harsha S