Appliquer regexp en fonction de choix de liste

Invité
Invité n'ayant pas de compte PHPfrance

04 sept. 2006, 16:14

voila pour un formulaire, je dois faire une liste déroulante qui permet de choisir son pays :

- si il choisi France dans la liste, la saisie du num. de telephone sera forcée par une expres. reguliere pour saisir forcement de cette facon la : XX XX XX XX XX (chiffres separes oas espace)
- si il choisi un autre pays, alors la saisie du num. de telephone est libre, il peut renseigner ce qu'il veut.

j'ai commencé un code pour les express. regulieres mais je ne vois pas trop comment m'y prendre apres pour modifier dynamiquement le champs telephone comme je le souhaite.

voila la liste déroulante du pays :
<select name="attribute37"  ><option value="france" >france<option value="belgique" >belgique<option value="suisse" >suisse</select>
<script>
function ValidatePhone(input,span) {
    if (doitVerrifier) {
        if (ok) {
            span.innerHTML="Numero de telephone <b>valide</b> !"
            return true;
        } else {
            span.innerHTML="Numero de telephone <b>invalide</b> !"
            input.focus()
            retrun false;
        }
    } else {
       span.innerHTML="<b>Aucune validation</b> ne s'applique pour votre pays";
       return true;
    }
}
</script>
Enfin comment faudrait il adopter mon code pour qu'il fonctionne avec ma liste. Et quel est le type de regexp a appliquer ? Merci bcp de votre aide. :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 sept. 2006, 17:20

Dans le cas ou c'est l'option France qui est sélectionnée, il te faut récupérer la valeur de l'input (.value) et la comparer avec une expression régulière. Pour ce faire, tu peux utiliser la fonction test() :

Code : Tout sélectionner

var ma_chaine = input.value; var mon_expression = / ... /; if (mon_expression.test(ma_chaine)) alert("Ma chaine respecte l'expression regulière"); else alert("Mouah ah ah !! Tu pensais que je ne le verrais pas si tu tapais n'importe quoi ?!");

Invité
Invité n'ayant pas de compte PHPfrance

04 sept. 2006, 17:33

bjour ryle, euh ce que j'aimerai c'est que des que le user commencer a rentrer des mauvais caracteres, (lettres, pas d'espace au bout de 2 chiffres etc...) une alert box s'affiche. est ce le cas avec ton exemple ou ca attends de passer a une autre box pour le signaler ?

Si oui a quoi correspond ma_chaine et mon_expression ? pourrais tu donner un exemple concret avec ma liste deroulante et une regexp bidon ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 sept. 2006, 17:42

Ce que je t'ai donné permet de tester si une chaine correspond à l'expression régulière spécifiée. "ma_chaine" correspondrait en fait à la valeur saisie par l'utilisateur et "mon_expression" au format attendu.

En fonction de ton expression, tu peux faire appel à ce test une fois que l'utilisateur quitte le champ de saisie ou à chaque fois qu'il presse une touche. Dans le premier cas, l'expression est simple puisqu'il s'agit de ton format complet (chiffres plus espaces), dans le second il faut accepter 1 chiffre, ou 2, ou 2 et un espace, ou 2 un espace et 1 chiffre, etc.
Mais il faudra tout de même tester le résultat avec l'expression complète lors de la sortie du champ pour s'assurer que l'utilisateur ne s'est pas arrêté en cours de route :)

Et puis comme exemple, voici un test pour vérifier qu'une valeur est un code couleur :

Code : Tout sélectionner

var couleur = "#FF0000"; var expr = /^#[0-9]{6}$/; if (expr.test(couleur)) // respecte le masque alert("C'est un code couleur"); else // sinon alert("Ce n'est pas un code couleur");

Petit nouveau ! | 9 Messages

05 sept. 2006, 11:28

Re, j'ai testé un bout de code, mais deja ma regexp (pour forcer a saisir de la forme XX XX XX XX XX) ne fonctionne pas :/ Ensuite pourrai t on m filer un coup d main pour modifier pour que si 'on choisisse bas rhin, la regexp s'applique, sinon, on permet de saisir ce qu on veut dedans :

Code : Tout sélectionner

<select name="departement" id="departement"> <option value="67">Bas-Rhin (67)</option> <option value="68">Haut-Rhin (68)</option> </select> <script> function chiffres(event) { reg = new RegExp(/[0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}/); if (!reg.test(attribute21.value)){ //un traitement quelconque }else{ alert('Veuillez saisir le téléphone sous format XX.XX.XX.XX.XX'); attribute21.value = ""; } } </script> <input type=text name="attribute21" class="attributeinput" onkeypress="chiffres(event)" size="40" maxLength="20" value="">
Merci d avance de laide/ :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 sept. 2006, 11:56

Y a pas mal de petites choses qui ne vont pas...

- Pour accéder à la valeur d'un champ dans un formulaire il faut utiliser la syntaxe suivante (pour les <select>, la syntaxe est différente pour des raison de compatibilité, voir ci dessous) :
"document.nom_formulaire.nom_champ.value" et non pas seulement "nom_champ.value"
- Ta condition n'est pas dans le bon sens : avec le point d'exclamation, tu testes si le champ ne respecte pas la condition, mais n'exécute pas le code approprié.
- Ton expression régulière ne considère que le format final. En la testant à chaque fois que l'utilisateur presse une touche, il ne sera jamais respecté à moins que l'utilisateur ne copie/colle son numéro. Il te faut soit contrôler à la fin de la saisie, soit faire un autre masque qui conviendrait pour tester la chaine en cours de saisie.

Pour tester le select, la syntaxe est la suivante :
document.nom_formulaire.nom_champ.options[document.nom_formulaire.nom_champ.selectedIndex].value
Tu devrais ainsi facilement pouvoir récupérer la valeur du département sélectionné et la tester :)

Invité
Invité n'ayant pas de compte PHPfrance

05 sept. 2006, 15:29

bon j'en suis tjs au meme point :(. Je tente 1001 choses mais rien n'y fait. La regexp ne marche tjs pas, et je ne vois toujours pas comment appliquer cette regexp juste si on choisi haut rhin par exemple.
Si quelqu'un passe par la, ou ryle, pourriez vous essayer de filer un coup de main ? Je desespere vraiment la.. ://
<form name = "form1" action "localhost/lists/">
<select name="departement" id="departement">

              <option value="67">Bas-Rhin (67)</option>
                  <option value="68">Haut-Rhin (68)</option>
                </select>
<script>
function chiffres(event) {
    reg = new RegExp(/[0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}/);
    if (!reg.test(attribute21.value)){
        //un traitement quelconque
      }else{
               alert('Veuillez saisir le téléphone sous format XX.XX.XX.XX.XX');
     document.form1.attribute21.value = "";   
           }
}
</script>

<input type=text name="attribute21"  class="attributeinput" onkeypress="chiffres(event)" size="40"  maxLength="20" value="">
</form>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 sept. 2006, 15:42

Ton if() est toujours dans le mauvais sens, et si tu as bien appliqué le document.formulaire.champ.value sur le deuxième attribute21, tu as oublié de le faire sur celui qui est dans le test()

Pour tester le département, il suffit de mettre une condition dans ta fonction et de comparer la valeur sélectionnée au chiffre attentdu :

Code : Tout sélectionner

SI ( valeur_selectionnée_du_select == valeur_attendue ) { FAIRE le reste des tests }
Commence déjà par corriger cela, et on regardera le masque ensuite :)

(par ailleurs, il n'y a aucun intérêt a récupérer l'évenement event si tu ne l'utilise pas, et je te suggère d'utiliser l'action onKeyUp qui a lieu une fois le champ modifié, plutôt que onKeyPress qui a lieu avant la modification)

Invité
Invité n'ayant pas de compte PHPfrance

05 sept. 2006, 16:03

Code : Tout sélectionner

<form name = "form1" action "localhost/lists/"> <select name="departement" id="departement"> <option value="67">Bas-Rhin (67)</option> <option value="68">Haut-Rhin (68)</option> </select> <script> if (document.form1.attribute21.value = "67") { function chiffres(event) { reg = new RegExp(/[0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}/); if (reg.test(document.form1.attribute21.value)){ //un traitement quelconque }else{ alert('Veuillez saisir le téléphone sous format XX.XX.XX.XX.XX'); document.form1.attribute21.value = ""; } } </script> <input type=text name="attribute21" class="attributeinput" onkeypress="chiffres(event)" size="40" maxLength="20" value=""> </form>
Mais c'est ou que ca pose probleme ? Ce n'est pas possible que tu modifie ce qui ne va pas !? je ne suis pas de mauvaise foi ou flemard, mais ca fait des heures et des heures que je bloque sur ce probleme, sans trouver la solution, et toi tu as l air de oir comment ca se passe ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 sept. 2006, 17:36

Tu n'es pas très loin.. le if aurait du être dans la fonction et pas en dehors. Quant à l'opérateur de comparaison, c'est ==, si tu n'en met qu'un seul, il affecte la valeur (le résultat est donc toujours vrai).

Voici donc à quoi devrait ressembler ta fonction. Reste le problème du masque à résoudre.

Code : Tout sélectionner

function chiffres() { // si l'option selectionnée a pour valeur 67 if (document.form1.attribute21.options[document.form1.attribute21.selectedIndex].value == 67) { reg = new RegExp(/[0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}/); if (reg.test(document.form1.attribute21.value)) { //un traitement quelconque } else { alert('Veuillez saisir le téléphone sous format XX.XX.XX.XX.XX'); document.form1.attribute21.value = ""; } } }

Le soucis avec le masque, c'est que comme tu testes à chaque caractère, il faut autoriser les différents formats de saisie possible sinon tu auras à chaque touche :
0 n'est pas au format XX.XX.XX.XX.XX
01 n'est pas au format XX.XX.XX.XX.XX
01. n'est pas au format XX.XX.XX.XX.XX
01.2 n'est pas au format XX.XX.XX.XX.XX
...

Tu peux donc soit garder ton masque et ne faire le test qu'à la fin de la saisie (sur l'évenement onBlur du champ), soit modifier ton masque pour qu'il tolère toute ses possibilité, et faire un nouveau contrôle à la fin de la saisie pour s'assurer que l'utilisateur ne s'est pas arrêté en cours de route :)

Invité
Invité n'ayant pas de compte PHPfrance

06 sept. 2006, 00:00

Re, bon je vais adopter pour le mode "fin de saisie", j'ai donc rajouté l'evenement onBlur, et mis ton bout de code, mais toujours aucun effet oO :
<script>
function chiffres() {
  // si l'option selectionnée a pour valeur 67
  if (document.validation.attribute21.options[document.validation.attribute21.selectedIndex].value == 67) {

    reg = new RegExp(/[0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}/);
    if (reg.test(document.form1.attribute21.value)) {
        //un traitement quelconque
    }
    else {
      alert('Veuillez saisir le téléphone sous format XX.XX.XX.XX.XX');
      document.validation.attribute21.value = "";   
    }
  }
}
</script>
<form method="post" onSubmit="return checkbae()" action="http://localhost/lists/?p=subscribe&id=1" name="validation" target = "_self">
telephone
<input type=text name="attribute21"  class="attributeinput"  size="40"  onBlur="chiffres(event)" maxLength="20" value="">
Et dans le debuger, il me sort :

Code : Tout sélectionner

document.validation.attribute21.options has no properties
Ce qui correspond a cette ligne :
if (document.validation.attribute21.options[document.validation.attribute21.selectedIndex].value == 67) {
One idea ? oO

Eléphanteau du PHP | 33 Messages

06 sept. 2006, 00:06

Oups re, j'ai oublié de recopier le code des listes, au cas ou ca vidnrait de la p :
<script>
function chiffres() {
  // si l'option selectionnée a pour valeur 67
  if (document.validation.attribute21.options[document.validation.attribute21.selectedIndex].value == 67) {

    reg = new RegExp(/[0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{2}/);
    if (reg.test(document.form1.attribute21.value)) {
        //un traitement quelconque
    }
    else {
      alert('Veuillez saisir le téléphone sous format XX.XX.XX.XX.XX');
      document.validation.attribute21.value = "";   
    }
  }
}
</script>

<form method="post" onSubmit="return checkbae()" action="http://localhost/lists/?p=subscribe&id=1" name="validation" target = "_self">

telephone

<select name="departement" id="departement">
<option value="67">Bas-Rhin (67)</option>
<option value="68">Haut-Rhin (68)</option>
</select> 

<input type=text name="attribute21"  class="attributeinput"  size="40"  onBlur="chiffres(event)" maxLength="20" value="">

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

06 sept. 2006, 10:34

Oops mea culpa... le nom du select dans le if() n'est pas "attribute21" mais "departement" :)
(J'ai été victime d'un copier/coller malheureux ;))

Invité
Invité n'ayant pas de compte PHPfrance

06 sept. 2006, 10:52

euh, pour tout les attribute21 il faut remplacer par departement ? je viens de tester toujours aucun effet :( . Ou est ce juste a un endroit specifique ?

Eléphanteau du PHP | 33 Messages

06 sept. 2006, 10:57

lol ok, oui c etait les attribut21, et aussi le form1 qui etait resté isolé oO.

Donc la le regexp est bien pris en compte quand la valeur 67 est choisie, mais meme en mettant au format 00.00.00.00.00, quand je sors de la box a chaque fois il me dit que ce n'est pas au bon format lol oO

une idée de ce qui ne va pas ?