Expression régulière

Bonjour à tous !

Je travaille actuellement sur des champs textes qui doivent vérifier certaines conditions : s’écrire JJ/MM/AAAA ou JJ/MM/AAAA HH:MM ou JJ/MM/AAAA HH:MM:SS.
J’utilise donc une expression régulière associée à du JavaScript pour tester cela sur un évènement onBlur.

Voici l’expression régulière :
var reg = /^(([0-2]\d|[3][0-1])//\d{2})$|^(([0-2]\d|[3][0-1])//\d{2}\s([0-1]\d|[2][0-3])[:][0-5]\d)$|^(([0-2]\d|[3][0-1])//\d{2}\s([0-1]\d|[2][0-3])[:][0-5]\d[:][0-5]\d)$/gi;

La partie principale est celle-ci : ^(([0-2]\d|[3][0-1])//\d{2})$ (JJ/MM/AAAA).

Sur IE tout fonctionne parfaitement, sur Firefox, c’est beaucoup plus aléatoire. Lorsque je remplis mon champ texte par “21/10/1998” par exemple et que je quitte mon champ texte, aucune erreur, mais si je refais cette manipulation une 2ème fois, l’alerte que j’ai mis en cas d’erreur s’affiche. :S Aucune erreur ne s’affiche dans la console d’erreur.

D’où cela peut-il venir ? Et surtout, comment régler le problème ?
Edité le 21/07/2008 à 13:27

Et tu l’appliques comment exactement?

Au passage, ta regexp me semble un brin compliquée pour ce que tu fais.

Notamment:

var reg = /^([012]\d|3[01])//\d{2}(\s+2[0-3]|[01]\d):[0-5]\d(:[0-5]\d)?)?$/gi;

Plus court. (vérifie que ce soit ok sous IE quand même, j’attends ton script qui vérifie que la chaine vérifie la regexp)

Voilà comment je l’utilise :

                 "   if ( document.getElementById(prefix + texte).value != '' ){" & vbCrLf & _
                            "       if ( !reg2.test(document.getElementById(prefix + texte).value) ){" & vbCrLf & _
                            "           window.alert(alerte);" & vbCrLf & _
                            "           document.getElementById(prefix + texte).value = '';" & vbCrLf & _
                            "           return false;" & vbCrLf & _
                            "       }" & vbCrLf & _
                            "   }" & vbCrLf & _

Pour la simplification, je vais tester, mais si déjà ce que j’ai fonctionne sous Firefox, je serais déjà contente…

Peux tu afficher le code sans le bousier ASP / VB ?

(genre ce que le navigateur reçoit)

<td class="Contenu1" width="300" valign="middle">
     <span id="rptFieldsList__ctl1_lblName">Date d'inscription</span>
     <span id="rptFieldsList__ctl1_lblType" style="Display:none">1</span>
</td>

<td class="Contenu1" width="150" align="center" valign="middle">
     <select name="rptFieldsList:_ctl1:dwnOp" id="rptFieldsList__ctl1_dwnOp" class="form" onChange="affichage('rptFieldsList__ctl1_',this.value,1);">
          <option value="0">---------- Critère ----------</option>
          <option value="1">Renseigné</option>
          <option value="2">Non renseigné</option>
          <option value="5">inférieur strictement à</option>
          <option value="6">supérieur strictement à</option>
          <option selected="selected" value="7">Compris entre</option>
          <option value="10">il y a</option>
          <option value="11">dans</option>
          <option value="12">strictement la date</option>
          <option value="13">date anniversaire</option>
     </select>
</td>

<td class="Contenu1" width="300" valign="middle">
     <span id="rptFieldsList__ctl1_spanVal1" style="DISPLAY:none">
          <input name="rptFieldsList:_ctl1:tbValeur1" type="text" value="15/05/2004 15:00:00" maxlength="500" size="50" id="rptFieldsList__ctl1_tbValeur1" class="form" OnBlur="verifDateEntier('rptFieldsList__ctl1_','tbValeur1','Format correct : JJ/MM/AAAA ou JJ/MM/AAAA HH:MM:SS ou JJ/MM/AAAA HH:MM')" />
          <span id="rptFieldsList__ctl1_spanVal2" style="DISPLAY:none">
               <span id="rptFieldsList__ctl1_lblAnd">
                    et
               </span>
               <input name="rptFieldsList:_ctl1:tbValeur2" type="text" value="23/05/2004" maxlength="500" size="50" id="rptFieldsList__ctl1_tbValeur2" class="form" OnBlur="verifDateEntier('rptFieldsList__ctl1_','tbValeur2','Format correct : JJ/MM/AAAA ou JJ/MM/AAAA HH:MM:SS ou JJ/MM/AAAA HH:MM')" />
          </span>
     </span>

     <span id="rptFieldsList__ctl1_spanValDwn" style="DISPLAY:none">
          <select name="rptFieldsList:_ctl1:dwnValeur" id="rptFieldsList__ctl1_dwnValeur" class="form">
     </select>
</span>

ETC...

Voilà le bout de code correspondant à mon contrôle.

Je dois être aveugle car je ne vois pas ta fonction verifDateEntier

C’est elle - dans sa version lue et interprétée par Fx - qui m’intéresse. Je veux voir si c’est au niveau du test, ou au niveau du onblur. Et ça, je le peux via Firebug.

Voici la fonction verifDateEntier :

function verifDateEntier(prefix,texte,alerte){
var reg = new RegExp('^([0]?[1-9]|[1|2][0-9]|[3][0|1])[/]([0]?[1-9]|[1][0-2])[/]([0-9]{4}|[0-9]{2})$','gi'); // Que pour la date
var reg2 = /^(([0-2]\d|[3][0-1])[/]([0]\d|[1][0-2])[/]([1][9]|[2][0])\d{2})$|^(([0-2]\d|[3][0-1])[/]([0]\d|[1][0-2])[/]([1][9]|[2][0])\d{2}\s([0-1]\d|[2][0-3])[:][0-5]\d)$|^(([0-2]\d|[3][0-1])[/]([0]\d|[1][0-2])[/]([1][9]|[2][0])\d{2}\s([0-1]\d|[2][0-3])[:][0-5]\d[:][0-5]\d)$/gi; // Date et Heure
   if ( document.getElementById(prefix + texte).value != '' ){
       if ( !reg2.test(document.getElementById(prefix + texte).value) ){
           window.alert(alerte);
           document.getElementById(prefix + texte).value = '';
           return false;
       }
   }
}

Ce bout de script se trouve après la balise .

j’ai testé:

/^([012]\d|3[01])//\d{2}(\s+(2[0-3]|[01]\d):[0-5]\d(:[0-5]\d)?)?$/gi.test(‘26/12/1983 12:13:12’); -> true
/^([012]\d|3[01])//\d{2}(\s+(2[0-3]|[01]\d):[0-5]\d(:[0-5]\d)?)?$/gi.test(‘26/12/1983 12:13’); -> true
/^([012]\d|3[01])//\d{2}(\s+(2[0-3]|[01]\d):[0-5]\d(:[0-5]\d)?)?$/gi.test(‘26/12/1983’); -> true
/^([012]\d|3[01])//\d{2}(\s+(2[0-3]|[01]\d):[0-5]\d(:[0-5]\d)?)?$/gi.test(‘33/12/1983 12:13:12’); -> false

Je suppose que soit 1) ton teste foire - à la récupération des valeurs 2) soit ça foire au niveau du onblur.

Mais pourquoi ça fonctionne pour IE alors ?

bonne question:)

en tout cas, teste d’abord ta regexp comme je l’ai fais

tu sauras si c’est la regexp ou autre chose dans ton code

Bonjour,

J’ai testé comme tu me l’as dis en faisant afficher une alerte avec le résultat (puisque je ne peux pas faire de pas à pas).
Donc en renseignant une date dans le champ texte, avant de me dire si c’est ok ou non, j’affiche tous les résultats.

Manipulation :
Je clique dans le champ texte et renseigne une date (15/05/2004), je clique ensuite ailleurs dans la page.
Une alerte s’affiche m’affichant le 1er résultat : TRUE. A chaque fois, je clique sur OK pour voir les autres alertes.
Dans l’ordre T-T-T-F. Ca correspond donc à ce que tu m’as donné. Et il laisse la date saisie dans le champ.
Je refais la même manipulation en cliquant juste dans le champ texte puis en cliquant ailleurs. De même, il m’affiche les alertes correspondants aux tests, voici les résultats : F-F-F-F… Et évidemment, il ne valide plus la date qui est dans le champ…

à la place de ta regexp, affiche la valeur du champ?

Il récupère la bonne chose.

J’ai fait un 2d test :
Je récupère la valeur du champ texte, je l’affiche dans une alerte.
Je fais le reg.test et j’affiche le résultat.

Ce que j’ai remarqué :
Il alterne les true et false.

N’y a-t-il pas un moyen de réinitialiser la variable que j’utilise ?


Juste une petite chose : l'alternance entre true et false n'est fait que sur Firefox, IE m'affiche toujours true.

Dans tous les cas?

Au passage: developer.mozilla.org…

C’est pour ça que j’écarterai la regexp. Tu devrais cependant la mettre en cache dans une variable globale, pour limiter les effets de bord.