2009-12-05 6 views
0

Je suis relativement nouveau pour les expressions régulières mais j'ai réussi à créer une expression de travail pour valider les dates (sans années bissextiles, et en supposant que les gens saisissent un chiffre valide de 30 ou 31 pour un mois).PHP Dynamic Expression régulière?

C'est Expressen: /^\d[1-31]{2}\-\d[1-12]{2}\-\d[1900-2009]{4}$/

mais je voudrais avoir une expression régulière dynamique comme:

$yearSpan = (date("Y") - 110)."-".date("Y"); 
/^\d[1-31]{2}\-\d[1-12]{2}\-\d[$yearSpan]{4}$/ 

Lorsque je tente d'utiliser cette expression, il ne cesse de me dire la compilation a échoué car un range hors de l'ordre dans la classe de caractères. J'utilise cette expression pour valider les dates de naissance, et il serait bon de ne pas la mettre à jour chaque fois qu'une année passe.

Des suggestions?

Répondre

3

Je pense que vous devriez envisager d'utiliser certaines fonctions de date/heure à cette fin.

Vous utilisez les classes de caractères dans le mauvais sens. [1-31], [1-12] et [1900-2009] ne vérifie pas les plages que vous avez dedans. Ce n'est pas comment character classes travail et donc ce n'est pas comment vous vérifiez numeric ranges avec regex.

Une classe de caractères [a-r] correspond à n'importe quel caractère de a à r. [a-rx] correspond à n'importe quel caractère de a à r et au caractère x. De même, [1-39] correspond à n'importe quel caractère de 1 à 3 et le caractère 9 - d'où il correspond à l'un de 1,2,3 et 9 - et pas n'importe quel nombre de 1 à 39 comme vous le vouliez.

[1-31]{2} correspond à deux nombres consécutifs (le dernier 1 est redondant), tous les deux compris entre 1 et 3 - 33 est une correspondance valide.

Pour correspondre à un nombre compris entre 1 et 31, l'expression rationnelle correcte est 0?[1-9]|[1-2][0-9]|3[0-1]. ('? 0' prend soin de zéro padding comme dans 01-09-2009

Pendant des mois: 0?[1-9]|1[0-2]

Pour l'année: 19[0-9]{2}|200[0-9]

Et - n'est pas un caractère méta en dehors des classes de caractères - vous devez échapper à pas.

La regex correcte serait:

/^(0?[1-9]|[1-2][0-9]|3[0-1])-(0?[1-9]|1[0-2])-(19[0-9]{2}|200[0-9])$/ 

Si vous êtes n ot intéressé à capturer les valeurs, vous pouvez l'écrire comme:

/^(?:0?[1-9]|[1-2][0-9]|3[0-1])-(?:0?[1-9]|1[0-2])-(?:19[0-9]{2}|200[0-9])$/ 
+0

Merci pour votre réponse claire! Je vais utiliser la fonction checkdate mentionnée par Rimian. – Ben