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

Langage PHP Discussion :

Validation de caractères [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de MicaelFelix
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    254
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 254
    Par défaut Validation de caractères
    Bonjour,

    Aujourd'hui on m'a posé une bonne question sur comment utiliser le preg_match correctement pour valider un nom sur un site web (username).
    Moi j'aimerai faire un code qui détecte si la chaine contient :
    - Au moins 3 caractères
    - Suivis de
    - caractères de a à z (insensible à la casse)
    OU
    - des nombres de de 1 à 9


    Ça m'a pas l'air bien compliqué mais pourtant... ça fonctionne pas.

    Voici le code ci dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    	$var = preg_match("(...([a-z]|[1-9])*)","----");
     
    	if($var>0)
    		echo("ok trouvé");
    	else
    		echo("pas trouvé");
     
    	echo("<br>$var");
    ?>
    Ça ne devrait pas fonctionner et pourtant... ça fonctionne... il renvoie 1 comme si c'était bon.
    On dirait que c'est bon il vérifie si il y a trois caractères, mais ensuite tous les autres caractères passent.

    Je ne comprends pas

    Et puis j'avais testé : quelle est la différence entre :
    ([a-z]) et [a-z] ?
    Moi je n'en voit aucune, pourtant l'un renvoie 1 et l'autre 0 malgré la même chaine passée en paramètre! Les () sont nécessaires pour l'évaluation avec preg_replace ?

    Quelqu'un pourrait m'aider?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Par défaut
    Bonsoir,
    que voulez-vous comme restriction?

    Expliquez plus clairement, en donnant plusieurs exemple de ce que vous voulez et ne voulez pas.

    Cordialement,
    DaRiaN.

  3. #3
    Membre émérite
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Par défaut
    Effectivement, il renvoie une correspondance, car il manque le début et fin de ligne.
    Soit :

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    et aussi parce que ([a-z]|[1-9])* veut dire "des chiffres, des lettres ou rien du tout". Le + serait préférable à l'étoile dans ce cas...

  5. #5
    Membre éclairé Avatar de MicaelFelix
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    254
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 254
    Par défaut
    Citation Envoyé par neilbgr Voir le message
    Effectivement, il renvoie une correspondance, car il manque le début et fin de ligne.
    Merci !!!

    C'est exact, en fait je viens de comprendre, c'est que comme je n'avais pas fixé le début ni la fin, ben il trouvait un caractère qui correspondait et pouvait s'arrêter avec une correspondance.

    Voici mon code modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $chainetestee = "abc14w";
    preg_match("(^([a-z]|[1-9])([a-z]|[1-9])([a-z]|[1-9])([a-z]|[1-9])*$)",$chainetestee);
    Et ça fonctionne impecc. Avant j'avais "..." mais c'était pas bon parce que ça représentait n'importe quel caractère.

    Y'a-t-il une solution plus optimisée?

    Parce que j'utilise ([a-z]|[1-9]) quatre fois dans l'expression.
    Peut-on faire mieux ?

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Par défaut
    Y a toujours moyen de faire plus court, mais plus optimisé, aucune idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`^([[:alnum:]]{4,})$`';

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Les [classes de caractères] sont plus efficaces que les (alter|natives).

    Sinon, attention, [:alnum:] prendra le 0. J'adapterais ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`^([a-z1-9]{4,})$`';
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`^([a-z1-9]{4,})$`i';
    pour ignorer la casse.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Par défaut
    Oula... je devais être fatigué hier, désolé. Par contre dans ce cas, adieu les caractères accentués (je ne sais pas s'il en a besoin) et tout ça pour un zéro qu'on pourrait facilement retrouver avec un strpos.

    Allez, une dernière possibilité?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`^([A-z1-9]{4,})$`';
    Pour l'autre cas de figure, peut-être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`^(([[:alpha:]]|[1-9]){4,})$`';

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    ou même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`^([[:alpha:]1-9]{4,})$`';
    Mais je croyais que [:alpha:] et [:alnum:] ne prenait les accents que quand il y avait une locale ?

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Par défaut
    Je ne sais pas, je travaille rarement avec les REGEX. Il faudra surement rajouter ce genre de code en début de script, tout dépendra du serveur et de sa configuration.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      setlocale(LC_ALL, 'fr_FR.ISO-8859-1');

  11. #11
    Membre éclairé Avatar de MicaelFelix
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    254
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 254
    Par défaut
    Ok parfait sauf qu'on m'a pas expliqué la différence avec et sans () pourquoi j'obtenais des résultats différents. Bof en tous cas c'est pas si grave, peut être que j'avais fait une autre erreur.

    En tous cas, merci à tous, votre aide a été précieuse

  12. #12
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    T'avais dû faire une autre erreur

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

Discussions similaires

  1. SQL et GUID : Valeur de caractère non valide pour la ....
    Par jackfirst72 dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/03/2007, 10h46
  2. [XSD] validation de caractères spéciaux
    Par arthix dans le forum Valider
    Réponses: 4
    Dernier message: 16/09/2006, 14h18
  3. [JDBC][Débutant] Caractère non valide
    Par mavina dans le forum JDBC
    Réponses: 5
    Dernier message: 24/07/2006, 13h54
  4. [DOM] Caractère XML non valide
    Par alliance dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 14/02/2006, 11h05
  5. [JDBC]Caractère non-valide
    Par calimero82 dans le forum JDBC
    Réponses: 2
    Dernier message: 16/02/2005, 14h22

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