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 :

Incompréhension des résultats obtenus par rapport au motif employé [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 663
    Points : 174
    Points
    174
    Par défaut Incompréhension des résultats obtenus par rapport au motif employé
    Bonjour,

    Il y a quelque chose que je ne pige vraiment pas avec les regex.

    Soit l'expression régulière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ereg('[^a-zA-Z0-9]', 'maison')
    vérifie que le mot (maison) ne contient aucun caractère
    alphanumérique ([^a-zA-Z0-9]). L'expression retourne donc
    faux

    Là où je ne comprend vraiment plus rien c'est lorsque
    je rentre ce mot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ereg('[^a-zA-Z0-9]', 'mais:@on')
    L'expression retourne vrai
    Ce qui n'est pas bon puisque le mot contient toujours des lettres.

    Est ce que quelqu'un pourrait m'expliquer ?

    Merci

  2. #2
    Membre confirmé
    Développeur Web
    Inscrit en
    avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    salut,
    Tu n'as pas précisé le début '^' ou bien la fin '$' de l'expression. La chaîne est donc parcouru du début à la fin à la recherche d'un ou des caractère(s) satisfaisant.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ereg('[^a-zA-Z0-9]', 'mais:@on', $regs);
    print_r($regs); // :
    Dans le cas d'une délimitation du début et/ou de la fin la chaîne est parcouru si un caractère ne satisfait pas le masque la fonction s'arrête est renvoi false.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var_dump(ereg('^[^a-zA-Z0-9]$', 'mais:@on')); // bool(false)
    Zend PHP5 Certification
    MySQL 4 Core Certification

  3. #3
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 663
    Points : 174
    Points
    174
    Par défaut
    Merci pour ta réponse. Malheureusement je me sens encore plus embrouillé
    Vraiment j'ai du mal à piger cette logique.
    J'ai surtout du mal à comprendre comment la chaine est évaluée.
    Pourrais tu m'expliquer comment la chaine est parcourue et ce qui
    détermine la valeur du résultat (vrai/faux) avec
    et sans la délimitation ?

  4. #4
    Membre confirmé
    Développeur Web
    Inscrit en
    avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    Citation Envoyé par php.net
    ereg() retourne la longueur de l'occurrence trouvée si une occurrence a été trouvée dans la chaîne string et FALSE dans le cas contraire ou si une erreur est survenue. Si le paramètre optionnel regs n'est pas passé à la fonction ou si la longueur du paramètre string vaut 0, la fonction retournera 1.
    ----- sans délimiteur -----
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump(ereg('[^a-zA-Z0-9]', 'maison')); // bool(false)
    Ce qu'il faut comprendre c'est que tous les caractères sont accepté sauf (lettre minuscule, majuscule et chiffre). On prend la chaîne caractère par caractère sans altéré le jugement de l'un à l'autre. Rien correspondant à cela n'a était trouvé retourne => false
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump(ereg('[^a-zA-Z0-9]', 'mai;son')); // int(1)
    Cette fois ci, un caractère se trouvant dans le "domaine" de recherche est trouvé => retourne 1
    ----- avec délimiteur -----
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump(ereg('^[^a-zA-Z0-9]$', 'maison')); // bool(false)
    Aucun caractère ne satisfait le motif => false . Dans ce cas là on ne perçoit pas bien la différence.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump(ereg('^[^a-zA-Z0-9]$', 'mai;son')); // bool(false)
    La chaîne est pris comme un 'tout', la fonction retournera false car dans cette chaîne se trouve un caractère "interdit". Autrement dit, Il faut que tous les caractères de la chaîne respecte le motif.
    ----- conclusion -----
    En bref la différence :
    sans les délimiteurs :
    - On prend la chaîne caractère par caractère sans altéré le jugement d'un caractère à l'autre.
    avec les délimiteurs :
    - La chaîne est pris comme un 'tout', un caractère n'est pas conforme cela retourne false
    Zend PHP5 Certification
    MySQL 4 Core Certification

  5. #5
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 663
    Points : 174
    Points
    174
    Par défaut
    Oula c'est subtile !
    Dans mon exemple ce que je prenais pour un true n'était donc en fait qu'un int

    Effectivement il faut bien comprendre comment la chaine est évaluée avec et
    sans les délimiteurs car ça change toute la logique.

    Toutefois j'ai encore un doute quand tu dis:
    la fonction retournera false car dans cette chaîne se trouve un caractère "interdit".
    Ce n'est pas le caractère ; qui est interdit mais tous les autres, non ?

  6. #6
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 663
    Points : 174
    Points
    174
    Par défaut
    C'est encore moi.
    Je viens aussi de me rendre compte d'une erreur dans ta
    délimitation ce qui ajoute à ma confusion.
    Avec cette délimitation:
    Le pattern vérifie que la chaine a une longueur d'UN SEUL caractère et
    que celui-ci n'est pas alphanumérique.
    Alors qu'avec:
    Le pattern vérifie que la chaine a une longueur d'UN OU PLUSIEURS caractères et qu'aucun ne sont alphanumériques.
    En tous cas en rajoutant le + tout me semble redevenir logique dans les résultats retournés.

    Enfin dis moi si je me trompe.

  7. #7
    Membre confirmé
    Développeur Web
    Inscrit en
    avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    Citation Envoyé par tintin72 Voir le message
    Ce n'est pas le caractère ; qui est interdit mais tous les autres, non ?
    exacte c'est ce que je voulais dire.


    Citation Envoyé par tintin72 Voir le message
    Je viens aussi de me rendre compte d'une erreur dans ta délimitation ce qui ajoute à ma confusion.
    ce n'est pas une erreur, j'ai juste utilisé le masque que tu m'as donnée. Si j'aurais rajouté le nombre de répétition j'avais peur de t'embrouiller encore plus.

    Si tu y vois plus claire c'est une bonne avancée.
    Zend PHP5 Certification
    MySQL 4 Core Certification

  8. #8
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 663
    Points : 174
    Points
    174
    Par défaut
    Si j'aurais rajouté le nombre de répétition j'avais peur de t'embrouiller encore plus.
    Ok. Finalement ça m'a poussé à creuser plus en détail les délimitations.
    Si tu y vois plus claire c'est une bonne avancée.
    Effectivement, et je te remercie de m'avoir consacrer du temps pour m'expliquer tout ça.

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

Discussions similaires

  1. Faire le cumul des résultats ligne par ligne
    Par slap2 dans le forum Access
    Réponses: 4
    Dernier message: 17/01/2007, 10h35
  2. Boucler dans résultats obtenus par proc
    Par cryborg dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/07/2006, 17h26
  3. Avantages des scripts Perl par rapport au script UNIX ?
    Par MonsieurAk dans le forum Langage
    Réponses: 4
    Dernier message: 23/01/2006, 15h34
  4. [10g]Fonction des nouveaux services par rapport à la 9i
    Par Laurent Dardenne dans le forum Oracle
    Réponses: 13
    Dernier message: 04/07/2005, 14h56
  5. Réponses: 3
    Dernier message: 18/05/2003, 01h16

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