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 :

échec de test de validité [RegEx]


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut échec de test de validité
    Bonjour,
    j'utilise les RegExp pour contrôler le format des données saisies par l'utilisateur (je n'ai aucune expérience sur les RegExp). Mon contrôle acceptent des valeurs incorrectes. Peut-on me corriger ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $msg="";
    $pattern="/SESA[0-9]{5}/";
    $str="SESA12345";
    if (preg_match($pattern,$str))
    {
        $msg="OK";
    }
    else
    {
        $msg="NOK";
    }
    echo "msg=".$msg;
    Le format attendu est la chaîne de caractères SESA, suivie exactement de 5 chiffres. La chaîne "SESA12345" est acceptée mais aussi les chaînes "SESA123456" ou "SESA12345a" alors que je souhaite que les 2 dernières soient rejetées. Comment faire ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    preg_match() recherche une correspondance n'importe où dans la chaîne, c'est pour cette raison qu'il vérifie aussi tes deux exemples avec des caractères qui dépassent.

    Ce que tu peux faire c'est utiliser les ancres de début \A et de fin de chaîne \z dans ta pattern.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern="/\ASESA[0-9]{5}\z/";
    Tu peux aussi utiliser les ancres ^ et $ mais elles sont plus traîtres car $ réussit soit à la fin de chaîne, soit juste avant la fin de la chaîne lorsque le ou les derniers caractères forment une séquence de nouvelle ligne (comme \n ou \r\n). On peut forcer $ à ne réussir qu'à la fin de la chaîne avec le modificateur D (DOLLAR END ONLY):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern="/^SESA[0-9]{5}$/D";
    En bonus, le modificateur A (ANCHORED) permet d'ancrer la pattern au début de la chaîne (ou la fin de chaque correspondance lors de recherches multiples), on peut alors se passer de l'ancre de début de chaîne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern="/SESA[0-9]{5}\z/A";
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Ta culture sur les regexp m'impressionne. J'ai adopté la première solution qui marche parfaitement ($pattern="/\ASESA[0-9]{5}\z/";). Par contre, avec ton lien sur les ancres, j'ai pas compris le rôle de \A et \z.
    Y a bien cette phrase
    Notez que les métacaractères \A, \Z, et \z peuvent servir à repérer le début et la fin du sujet, et toutes les parties du masque qui commenceront par \A seront toujours ancrées
    mais c'est pas assez clair pour moi. Est-ce que j'aurais pu mettre soit \Ama_chaine\Z, soit \Ama_chaine\z ou y a d'autres possibilités ? (ou j'ai rien compris ? )
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Cette page du manuel PHP est assez mal faite (sans doute en voulant éviter la redondance) et du coup ce n'est pas spécialement clair. Les informations sur les ancres sont dispersées entre cette page, celle des séquences d'échappement et celle des métacaractères.
    Du coup il n'y a nul part sur le manuel une présentation groupée de ces ancres:

    ancres par défaut m (MULTILINE)* D (DOLLAR END ONLY)
    \A début de chaîne inchangé inchangé
    \z fin de chaîne inchangé inchangé
    ^ début de chaîne début de ligne inchangé
    $ fin de chaîne ou avant une nouvelle ligne finale fin de ligne fin de chaîne
    \Z fin de chaîne ou avant une nouvelle ligne finale inchangé inchangé
    \G début de chaîne ou position suivant la dernière correspondance inchangé inchangé

    (*) le mode multiline (modificateur m) ne permet pas d'écrire des patterns s'étendant sur plusieurs lignes, mais au contraire de travailler ligne par ligne en changeant le sens de ^ et $ (ce qui peut être utile pour des lignes de log ou des fichiers de configuration avec une option par ligne). Si ce mode est activé, le modificateur D est sans effet.

    Je te laisse méditer sur cet exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var_dump(preg_match('/\ASESA[0-9]{5}$/', "SESA12345")); // int(1)
    var_dump(preg_match('/\ASESA[0-9]{5}$/', "SESA12345\n")); // int(1)
    var_dump(preg_match('/\ASESA[0-9]{5}\Z/', "SESA12345")); // int(1)
    var_dump(preg_match('/\ASESA[0-9]{5}\Z/', "SESA12345\n")); // int(1)
    var_dump(preg_match('/\ASESA[0-9]{5}$/D', "SESA12345\n")); // int(0)
    var_dump(preg_match('/\ASESA[0-9]{5}\z/', "SESA12345\n")); // int(0)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Ouh là là, vu la complexité, je suis bluffé, et certain de ne jamais maîtriser...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Ne sois pas trop gourmand, qui va piano va sano, pour l'instant tiens toi s'en déjà à \A et \z qui ne changent jamais, ensuite tu essayeras les autres lors d'une séance de regex101 ou quand tu en auras la nécessité.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. Test de validité sur un fichier
    Par juliotte dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/04/2007, 15h46
  2. [Sécurité] Traitement préventif ou test de validité ?
    Par php_de_travers dans le forum Langage
    Réponses: 3
    Dernier message: 20/05/2006, 14h11
  3. Test de validité d'une adresse mail
    Par abigaelle dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 11/05/2006, 10h18
  4. [debutant][bean] test de validité d'un champs
    Par LoLoSS dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 20/05/2004, 12h16

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