2010-12-15 91 views
1

Je souhaite utiliser une expression rationnelle pour "forcer" un utilisateur à formater correctement un horodatage.Javascript RegExp pour autoriser uniquement certains caractères à certains endroits

En ce moment je peux limiter les entrées de sorte que l'utilisateur ne peut saisir des chiffres, un tiret ou deux points en utilisant les éléments suivants:

function allownumbers(e) { 
     var key = window.event ? e.keyCode : e.which; 
     var keychar = String.fromCharCode(key); 
     var reg = new RegExp("[-0-9: ]") 
     if (key == 8) { 
      keychar = String.fromCharCode(key); 
     } 
     if (key == 13) { 
      key = 8; 
      keychar = String.fromCharCode(key); 
     } 
     return reg.test(keychar); 
    } 

Cependant, l'utilisateur peut encore saisir des données incorrectes, par exemple 0000 :: - 12354 validerait. Puis-je utiliser une expression rationnelle pour forcer l'utilisateur à entrer #### - ## - ## ## ##: ##: ## (par exemple 2010-12-15 10:57:01)?

(encore plus cool serait si elle a ajouté automatiquement les tirets, et l'espace côlons quand il a frappé au bon endroit dans la chaîne.)

Cheers,

Ben

Répondre

1

Utilisez les jQuery validation plugin.

Puisque vous avez un format de date personnalisé, je vous dirigerai vers this SO post.

Si vous voulez forcer un certain motif pendant l'entrée, ne cherchez pas plus loin que masked input plugin.

+0

C'est exagéré - pourquoi mettre dans une autre bibliothèque entière pour une petite tâche comme ceci? – Benubird

+0

@Bububird: pas exagéré à mon avis; Si cela va être utilisé dans de nombreux endroits et peut-être différentes règles d'entrée, pourquoi ne pas l'utiliser? C'est une bonne solution pour un problème commun. – darioo

+0

Parce qu'il n'y a aucune implication que plus que cette seule tâche simple est nécessaire; Pour autant que nous sachions, cela pourrait être le seul javascript sur l'ensemble du site - vous supposez qu'il a «beaucoup d'endroits» où il sera utilisé, mais ce pourrait ne pas être le cas. Sans oublier que vous n'avez pas vraiment répondu à la question. Il posait des questions sur l'utilisation d'expressions régulières; le simple fait de dire "allez utiliser une bibliothèque" est très inutile, car il ne fournit aucune information. – Benubird

0

Votre modèle regexp peut être

var re = /\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d/; 
0

Vous pouvez le faire facilement - il suffit d'utiliser {} pour limiter le nombre d'entrées. Comme un exemple assez brut, regex: [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} fera ce que vous voulez, il suffit de le tester par rapport à l'ensemble du contenu de la zone de texte - par exemple. reg.match (e.srcElement.value). Si vous voulez qu'il soit testé au fur et à mesure, vous pouvez utiliser le code de this site pour déterminer la position du curseur, puis vérifier la nouvelle entrée par rapport à ce que vous attendez à cette position, et oui, même ajouter le tableau de bord ou l'espace automatiquement. Pourquoi ne pas simplement utiliser un petit bloc de validation?

0

après qu'ils aient entré la chaîne ...

var date = new Date(dtStr); 
if (isNaN(date) && dtStr != "MM/DD/YYYY") { 

    return alert('Please enter a valid date'); 
} 
else { 
    if (date.getFullYear() > 2100 || date.getFullYear() < 1900) { 
     return alert("Please enter a valid year"); 
    } 
}