2009-08-19 8 views
1

La valeur sera n'importe quoi et les correspondances sont nulles. Le but de ceci est de diviser une chaîne comme "1991-12-01" et assurez-vous que toutes les parties de la chaîne sont des dates valides.Quel est le problème avec ce code de validation jQuery? regexp.exec (value)

dateISO: function(value, element) { 
    if (this.optional(element)) return true; 
    var regexp = new RegExp('^\d{4}[\/-](\d{1,2})[\/-](\d{1,2})$'); 
    var matches = regexp.exec(value); 
    alert(matches); 

Des idées?

Répondre

7

L'expression que vous donnez est une chaîne, donc, il a besoin échapper:

var regexp = new RegExp('^\\d{4}[\\/-](\\d{1,2})[\\/-](\\d{1,2})$'); 

Vous pouvez faire les expressions de style Perl, mais les barres obliques doivent être échappé:

var regexp = /^\d{4}[\\/-](\d{1,2})[\\/-](\d{1,2})$/; 

(L'expression régulière de style perl renvoie un objet RegExp)

+1

Je ne veux pas ajouter une réponse puisque celui-ci est juste, mais je vais signaler Pour l'amour d'Ian, le modèle est assez libéral comme c'est le cas actuellement. Par exemple, dans le modèle actuel "1991-50-42" passerait comme une date valide. – EBGreen

+0

Oui, il y a un autre code que je n'ai pas montré pour des raisons esthétiques qui vérifie chaque élément dans les matchs. –

+0

Pourquoi ne pas simplement avoir le motif regex au moins s'assurer que la chaîne * pourrait * être une date? – EBGreen

4

Pourquoi ne pas simplement ignorer l'expression rationnelle ici? Je sais que c'est façon plus de code, mais il donnera des erreurs pour les dates qu'une regex ne peut pas, comme une date spécifiant le 31 Novembre.

var datesToTest = [ 
    "1991-12-01" // valid 
    , "1991-11-31" // invalid, Nov has 30 days 
    , "1991-13-01" // invalid, no 13th month 
]; 

// Note: console.log() requires Firebug - switch to alert() if you wish 
for (var i = 0; i < datesToTest.length; i++) 
{ 
    if (!isValidDate(datesToTest[i], '-')) 
    { 
    console.log(datesToTest[i] + ' is not a valid date!'); 
    } else { 
    console.log(datesToTest[i] + ' is valid date!'); 
    } 
} 

function isValidDate(dateAsString, delimiter) 
{ 
    var dateObject = new Date(dateAsString.replace(new RegExp(delimiter, 'g'), '/')); 
    var checkDate = [ 
     dateObject.getFullYear() 
    , zeroFill(dateObject.getMonth() + 1, 2) 
    , zeroFill(dateObject.getDate(), 2) 
    ].join(delimiter); 
    return (dateAsString == checkDate); 
} 

function zeroFill(number, width) 
{ 
    width -= number.toString().length; 
    if (width > 0) 
    { 
    return new Array(width + (/\./.test(number) ? 2 : 1)).join('0') + number; 
    } 
    return number; 
} 

Cela fonctionne aussi longtemps que vous n'avez pas besoin de valider une date avant 100 AD = P

Questions connexes