Quel est le modèle d'expression régulière pour datetime (2008-09-01 12:35:45 ) ?

StackOverflow https://stackoverflow.com/questions/37732

  •  09-06-2019
  •  | 
  •  

Question

Quel est le modèle RegEx pour DateTime (2008-09-01 12:35:45 ) ?

J'obtiens cette erreur :

Aucun délimiteur de fin '^' trouvé

En utilisant:

preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45');

Donne cette erreur:

Avertissement:preg_match() [fonction.preg-match] :La compilation a échoué :rien à répéter au décalage 0 dans E:\www\index.php à la ligne 19

Était-ce utile?

La solution

@Espo :Je dois juste dire que les regex sont incroyables.Je détesterais avoir à écrire le code qui fait quelque chose d'utile avec les correspondances, par exemple si vous vouliez réellement savoir la date et l'heure que l'utilisateur a tapées.

Il semble que la solution de Tom serait plus tenable, car elle est environ un million de fois plus simple et avec l'ajout de quelques parenthèses, vous pouvez facilement obtenir les valeurs saisies par l'utilisateur :

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

Si vous utilisez Perl, vous pouvez extraire les valeurs avec quelque chose comme ceci :

$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$minute = $5;
$second = $6;

D'autres langues auront une capacité similaire.Notez que vous devrez apporter quelques modifications mineures à l'expression régulière si vous souhaitez accepter des valeurs telles que des mois à un chiffre.

Autres conseils

Une version simple qui fonctionnera pour le format mentionné, mais pas pour tous les autres selon @Espos :

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 

http://regexlib.com/REDetails.aspx?regexp_id=610

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(? =.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][ 26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]| 1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2 -9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0- 5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2}) ?$


Cela valide à la fois les dates et / ou les motifs de temps.Jours en févriersont également validés pour les années de saut.Rendez-vous:au format dd / mm / yyyy ou d / m / yy entre 1/1/1600 - 31/12/9999.Les zéros principaux sont facultatifs.Les séparateurs de date peuvent être des tirets correspondants (-), des barres obliques (/) ou des périodes (.) Fois:Dans le format HH: MM: SS AM / PM 12 heures (12 h 00 - 23:59:59) ou HH: MM: Format de temps militaire SS (00:00:00 - 23:59:59).Le format de 12 heures:1) Peut avoir un zéro leader pour l'heure.2) Les minutes et les secondes sont facultatives pour le format de 12 heures 3) AM ou PM est requis et sensible à la casse.Le temps militaire 1) doit avoir un zéro leader pour toutes les heures de moins de 10.2) Les minutes sont manditory.3) les secondes sont facultatives.Dates et heures :combinaison des formats ci-dessus.Une date d'abord puis une heure séparée par un espace.ex) dd / mm / yyyy hh: mm: ss


Modifier:Assurez-vous de copier le RegEx depuis le site Web regexlib.com car StackOverflow supprime/détruit parfois les caractères spéciaux.

^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$
$date = "2014-04-01 12:00:00";

preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches);

print_r($matches);

$matchs sera :

Array ( 
   [0] => 2014-04-01 12:00:00 
   [1] => 2014 
   [2] => 04 
   [3] => 01 
   [4] => 12 
   [5] => 00 
   [6] => 00
)

Un moyen simple de diviser une chaîne au format datetime.

En ce qui concerne la réponse Imran du 1er septembre 2008 à 12:33, il manque:Dans le motif, les motifs corrects sont

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1);
print_r( $m1 );
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2);
print_r( $m2 );
preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3);
print_r( $m3 );

cela revient

Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 ) 

Voici ma solution :

/^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([012345][0-9])\:([012345][0-9])$/u

J'ai modifié le modèle regex de http://regexlib.com/REDetails.aspx?regexp_id=610.Le modèle suivant devrait correspondre à votre cas.

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

AAAA-MM-JJ HH:MM:SS

Les fonctions PHP preg nécessitent que votre regex soit entourée d'un caractère délimiteur, qui peut être n'importe quel caractère.Vous ne pouvez pas utiliser ce caractère délimiteur sans vous échapper à l'intérieur de l'expression régulière.Cela devrait fonctionner (ici le caractère délimiteur est /) :

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

// or this, to allow matching 0:00:00 time too.
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

Si vous devez faire correspondre des lignes contenant uniquement datetime, ajoutez ^ et $ au début et à la fin de l'expression régulière.

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45');

Lien vers preg_match() du manuel PHP

Voici une version simplifiée (provenant de la réponse d'Espo).Il vérifie l'exactitude de la date (même les années bissextiles) et hh:mm:ss est facultatif
Exemples qui fonctionnent :
- 31/12/2003 11:59:59
- 29-2-2004

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

Voici ma solution :

[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01][0-9]|2[0-3]):[0-5]\d

Regular expression visualization

Démo de débogage

https://regex101.com/r/lbthaT/4

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top