IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Tester si un caractère est contenu dans un des trois tableaux de caractères


Sujet :

JavaScript

  1. #1
    Membre très actif

    Homme Profil pro
    sans
    Inscrit en
    Octobre 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Octobre 2019
    Messages : 205
    Par défaut Tester si un caractère est contenu dans un des trois tableaux de caractères
    Bonjour, ça fait 5 heures que je cherche à résoudre le problème cité dans mon titre :/

    J'ai essayé avec indexOf rien à faire.
    J'ai essayé avec includes toujours rien.

    Pourtant ce sont deux fonctions simples :/

    mes tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    function valide(champ)
    {
    tableau1=['A','O','U','E','I'];
    tableau2=['B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Z'];
    tableau3=['&','#','{','}','(',')','@'];
    	for(i=0;i==champ.length-1;i++)
    	{
    		if(tableau1.includes(champ[i])==false)
    		{
    			return false;
    		}
     
    		if(tableau2.includes(champ[i])==false)
    		{
    			return false;
    		}
     
    		if(tableau3.includes(champ[i])==false)
    		{
    			return false;
    		}
    	}
    	return true;
    }
    Si j'ai un seul caractère d'un mot qui n'est pas dans ces trois tableaux ça doit me donner FALSE.
    Par exemple le mot : bravo1bravo doit donner FALSE puisque y a le chiffre qui n'est pas dans les trois tableaux.

    J'ai tout retourné dans tous les sens, avec
    if(valide(champ)==false) {faire action}
    avec
    if(valide(champ)!=false) {faire action}

    et avec if ok=0 return false

    mais en vain.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    C'est normal que cela ne fonctionne pas, la condition de la boucle for : i==champ.length-1 n'a pas de sens ici, il faudrait plutôt : i < champ.length...

    Le reste du code ne va pas non plus car si par exemple la première condition est fausse la fonction retourne false alors qu'elle ne devrait retourner false que si les deux autres conditions sont aussi fausses...

    Citation Envoyé par amateurprg Voir le message
    Par exemple le mot : bravo1bravo doit donner FALSE puisque y a le chiffre qui n'est pas dans les trois tableaux.
    Même sans le chiffre la fonction retournerait false car les lettres minuscules ne sont dans aucun tableau... Il faudrait mettre le mot champ en majuscule : champ = champ.toUpperCase() pour que cela fonctionne...

    J'ai fait un code que tu peux tester ici : https://jsbin.com/rixurirewi/edit?js,console ...

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function valide1(champ) {
        tableau1 = ['A', 'O', 'U', 'E', 'I'];
        tableau2 = ['B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Z'];
        tableau3 = ['&', '#', '{', '}', '(', ')', '@'];
     
        champ =  champ.toUpperCase();
     
        for (let i = 0, l = champ.length; i < l; i++) {
            if (!(tableau1.includes(champ[i]) || tableau2.includes(champ[i]) || tableau2.includes(champ[i]))) {
                return false
            }
        }
        return true
    }
     
     
    var res = valide1("bravo1bravo")
    console.log("retourne " + res + " pour le mot : 'bravo1bravo'");
     
    res = valide1("bravobravo")
    console.log("retourne " + res + " pour le mot : 'bravobravo'");

    On pourrait optimiser ton code par exemple en utilisant une regex à la place des 3 tableaux...

  3. #3
    Membre très actif

    Homme Profil pro
    sans
    Inscrit en
    Octobre 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Octobre 2019
    Messages : 205
    Par défaut
    Super !
    Merci beaucoup Beginner, c'est une super aide que tu me fais là, j'ai galéré des heures pour ça

    La première fois j'avais utilisé des "if else if" afin que toutes les conditions soient testées, mais le problème devait certainement venir au départ en tous cas de la condition du "for", comme tu l'a découvert et que je n'avais pas remarqué lors de mes tests.

    Pour bravo1bravo c'était juste un exemple mal choisi

    Les régex c'est utile, mais d'une part je ne maîtrise pas et d'autre part j'ai peur que cela ne soit pas accepté par tous les navigateurs, par exemple ceux non mis à jour parmi les utilisateurs.

    Dans ton exemple, tu teste les minuscules, mais si je veux tester aussi les majuscules, comment je peux faire s'ils sont ainsi "lowcase" ?
    Tu utilises aussi la condition dans le for : "if i<champ.length" en gros, mais un tableau commençant à 0 a un length plus grand de 1 que la valeur maxi du i du for, enfin je veux dire que pour un tableau qui a 8 caractères, et que le for compte de 0 à 8 il va dépasser de 1 le nombre réel de caractère non ? Puisque il va compter 9 fois (de 0 à 8 donc).
    Ou alors tu veux dire que i va prendre les valeurs de 0 à Nbre caractères, donc 8, et...heu je comprend plus lol.

    Merci encore Beginner !

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Citation Envoyé par amateurprg Voir le message
    Les régex c'est utile, mais d'une part je ne maîtrise pas et d'autre part j'ai peur que cela ne soit pas accepté par tous les navigateurs, par exemple ceux non mis à jour parmi les utilisateurs.
    Ok mais c'est obligatoire d'utiliser trois tableaux ? Avec un seul ça réduirait le code...

    Citation Envoyé par amateurprg Voir le message
    Dans ton exemple, tu teste les minuscules, mais si je veux tester aussi les majuscules, comment je peux faire s'ils sont ainsi "lowcase" ?
    Ben le code fonctionne pour les deux : les lettres du mot peuvent être en minuscules ou en majuscules ou un mixte des deux...

    Citation Envoyé par amateurprg Voir le message
    Tu utilises aussi la condition dans le for : "if i<champ.length" en gros, mais un tableau commençant à 0 a un length plus grand de 1 que la valeur maxi du i du for, enfin je veux dire que pour un tableau qui a 8 caractères, et que le for compte de 0 à 8 il va dépasser de 1 le nombre réel de caractère non ? Puisque il va compter 9 fois (de 0 à 8 donc).
    Ou alors tu veux dire que i va prendre les valeurs de 0 à Nbre caractères, donc 8, et...heu je comprend plus lol.
    Ben champ n'est pas un tableau mais une chaine de caractère mais bon c'est le même principe...

    Si la chaine a 8 caractères (champ.length vaut donc 8) la boucle compte de 0 à 7 et non de 0 à 8 car c'est inférieur stricte et non inférieur ou égale : if i < champ.length

    Quand i vaut 7 la condition est vraie mais quand i vaut 8 la condition est fausse car 8 n'est pas inférieur stricte à 8 (champ.length)...

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    Citation Envoyé par amateurprg Voir le message
    Les régex c'est utile, mais d'une part je ne maîtrise pas et d'autre part j'ai peur que cela ne soit pas accepté par tous les navigateurs, par exemple ceux non mis à jour parmi les utilisateurs.
    C'est une légende.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function valide1(champ) {
        return !/[^A-Z&#@(){}]/i.test(champ);
    }
    Ça devrait marcher même avec internet explorer 4.

    (Au passage, où est passé le Y dans tes tableaux?)


    • ! négation du test (true devient false, false devient true).
    • [^...] classe de caractère négative (à cause du ^ ): un caractère qui ne soit pas parmi ceux cités.
    • A-Z rang: tous les caractères de A à Z inclus
    • &#@(){} les autres caractères (chacun se figure lui-même)
    • i modificateur i, rendant la pattern case-insensitive (ce qui fait que A-Z représente également a-z)


    Donc si un caractère n'appartenant pas à la liste est trouvé, RegExp.prototype.test() renvoie true et compte tenu de la négation !, la fonction renverra false et vice-versa.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Merci CosmoKnacki,

    C'est plus concis avec les regex...

    PS: Je crois qu'il faudrait ajouté les lettres minuscules (a-z) car apparemment amateurprg veut que cela fonctionne pour les minuscules et les majuscules...

    EDIT; Ah non c'est bon : il y a le modificateur i...

  7. #7
    Membre très actif

    Homme Profil pro
    sans
    Inscrit en
    Octobre 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Octobre 2019
    Messages : 205
    Par défaut
    woaaah vous êtes vraiment super tous les deux, merci beaucoup pour vos explications et vos codes !

    Cosmoknacki : Tu as remarqué que le Y était absent, lol
    En fait je le mets avec les voyelles mais là je l'aie oublié :/
    Tu m'as appris les regex en un seul post de quelques lignes ! (ça me fait moins peur les régex là

    Beginner : Je comprends mieux et c'est vrai qu'un seul tableau c'est plus simple

    Je mets en résolu, vous êtes super sympas !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tester si un carré est contenu dans un rectangle
    Par loicmpax dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/04/2017, 11h02
  2. Tester si un chaîne est contenue dans une autre
    Par JonathanF dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/10/2011, 20h59
  3. Vérifier si une chaîne de caractère est contenu dans une autre
    Par Marvelll dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 22/02/2010, 14h54
  4. Réponses: 8
    Dernier message: 16/05/2008, 10h34
  5. Tester si un string est contenu dans un autre
    Par totoen dans le forum C#
    Réponses: 19
    Dernier message: 18/02/2008, 09h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo