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

Delphi Discussion :

recherche d'un caractère alphabétique dans une chaine


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut recherche d'un caractère alphabétique dans une chaine
    Bonjour,

    je cherche à controler la validité d'un mot de passe dans mon appli.
    Je dois pour ça tester qu'il existe au moins un caractère alphabétique, un mix de majiscules et de miniscules, un numérique, et un spécial..

    j'aurais voulu savoir s'il ya un moyen rapide pour faire ça, sans passer par des boucles If sans fin..

    J'ai entendu dire qu'il y avait les expressions régullières pour ça..
    qqn peut -il m'éclairer sur ça?
    Merci bp

  2. #2
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    je ne suis pas vraiment sûr que les expressions régulières soient la solution à ton problème (et de plus elles ne sont pas gérées nativement par Delphi), mais tu peux faire très facilement une machine à caractères :
    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
     
    function IsPassWordOK(password : String) : Boolean;
    var
      TrouveMajus, TrouveMinus, TrouveNumeric, TrouveSpecial : Boolean;
      i : Integer;
    begin
      // initialise
      TrouveMajus := False;
      TrouveMinus := False;
      TrouveNumeric := False;
      TrouveSpecial := Boolean;
     
      // examine le mot de passe
      for i := 0 to Length(password) - 1 do begin
        // est-ce une majuscule ?
        TrouveMajus := TrouveMajus or (password[i] in ['A'..'Z']);
        TrouveMinus := TrouveMinus or (password[i] in ['a'..'z']);
        TrouveNumeric := TrouveNumeric or (password[i] in ['0'..'9']);
        TrouveSpecial := TrouveSpecial or (password[i] in ['$', '%']);
      end;
     
      result := TrouveMajus and TrouveMinus and TrouveNumeric and TrouveSpecial;
    end;
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    Merci pour la solution..

    j'ai voulu utiliser des expressions régulières parce que j voulais que la méthode soit plus orientée vers du Dot Net com on compte migrer l'appli en Dot Net...

    en fait, je viens de me renseigner..
    Les expressions régulières ne sont effectivement pas gérées nativement en delphi.. elles utilisent un composant qui ne figure pas dans un Delphi de base..

    donc je suis bien preneur de ta méthode.. merci bien

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    par contre, comment on peut faire ça par les codes Ascii..???

    en fait, pour les caractères spéciaux, j'en ai un ptit paquet et je vé pas à m'amuser à tous les écrire!

    comment dire que TrouveSpecial := Ascii(Password) de (0*01 à 0*0f) et de (0*1a à 0*20) ??

    Merci

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Ord(S[i]) in [12..78]
    Ord retourne le code ASCII d'un caractère
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    juste une question..
    comment tu sais que c'est [12..78]??
    ça m'aiderait mieux à comprendre.. Merci

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    d'ailleurs g vérifié..
    il ya des caractères qui manquent .. comme le "?", les '{', '}' ...

    en fait ceci est l'ensemble de mes caractères dits spéciaux:

    !@#$%^&*()_+|~-=\`{}[]:";'<>?,./



    Merci

  8. #8
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    tu peux ajouter des plages de valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TrouveSpecial := TrouveSpecial or (password[i] in ['!'..'/']);
    ou alors comme le suggère tourlourou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TrouveSpecial := TrouveSpecial or (ord(password[i]) in [33..47]);
    dans les deux cas tu dois connaître l'ordre des caractères et leur code ANSII correspondant. pour cela il existe des dizaines de solutions, tu peux par exemple te construire un petit utilitaire : crée un noveau projet, déposes sur la form un ValueListEditor, et place ce code dans le OnActivate de la form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.FormActivate(Sender: TObject);
    var
      i : Integer;
    begin
      for i := 0 to 255 do
        ValueListEditor1.InsertRow(IntToStr(i), Chr(i), True);
    end;
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  9. #9
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    Citation Envoyé par laadhar
    Bonjour,

    je cherche à controler la validité d'un mot de passe dans mon appli.
    Je dois pour ça tester qu'il existe au moins un caractère alphabétique, un mix de majiscules et de miniscules, un numérique, et un spécial..
    Merci bp
    un appel un tel mot de passe "un mot de passe fort"

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Pour tester la présence de tes "caractères spéciaux" !@#$%^&*()_+|~-=\`{}[]:";'<>?,./ , tu crées un ensemble de caractères les contenant, et une petite fonction qui teste si un caractère en fait partie (pas obligatoire la fonction, tu peux faire le test directement dans to code, mais ça organise le code).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    const
     
      MesSpeciaux : set of char = ['!','@','#','$','%','^','&','*','(',')','_',
                                  '+','|','~','-','=','\','`','{','}',
                                  '[',']',':','"',';','''','<','>','?',','.','/']; 
     
      boolean isInMesSpeciaux (char c)
      begin
        result := c in MesSpeciaux;
      end;
    Et voilà tout.

    Les ensembles sont une des bonnes choses du Pascal, autant les utiliser, d'autant que Delphi optimise relativement bien le code correspondant.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    moi j'ai utilisé les expressions régulières pour tester la validité d'une adresse email et ca marche tres bien...
    le composant est facile a trouvé et a installer et les aides sont simples et puis il u a des exemples

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    et bien montre nous comment faire STP..

    Merci

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    voila j'ai mis en pieces jointes le TRegExp a installer ds ton projet tu aura une unité TRegExpr ensuite par exemple pour gérér l'email j'ai fait

    procedure Tfrm_utilisateur.lbe_EmailExit(Sender: TObject);
    begin
    if trim(lbe_Email.text) <> '' then begin
    if not (ExecRegExpr('^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]{2,}[.][a-zA-Z]{2,4}$', lbe_Email.Text)) then begin
    showmessage('E mail incorrect!');
    lbe_Email.SetFocus;
    end;
    end;
    end;



    ca c'est pour verifier si c'est correct mais il a aussi des fonctions pour remplacer extraire et tt regarde dans les demos

    je retrouve les sites et je l'ai met tt de suite...
    Fichiers attachés Fichiers attachés

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 34
    Points : 26
    Points
    26

Discussions similaires

  1. Suppression espace et caractère spéciaux dans une chaine de caractère
    Par arnaud036 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 12/10/2007, 10h51
  2. Récuperer des caractères Majuscules dans une chaine
    Par Loïc59 dans le forum Général VBA
    Réponses: 3
    Dernier message: 17/05/2007, 00h14
  3. [RegEx] caractère spéciaux dans une chaine
    Par BigBarbare dans le forum Langage
    Réponses: 3
    Dernier message: 12/04/2006, 11h53
  4. Réponses: 5
    Dernier message: 26/12/2005, 19h31
  5. [PERL]Nombre d'un caractère présent dans une chaine
    Par LE NEINDRE dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2005, 13h58

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