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 :

cette validation par regexp n'a aucun sens [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 339
    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 339
    Points : 5 723
    Points
    5 723
    Billets dans le blog
    1
    Par défaut cette validation par regexp n'a aucun sens
    Bonjour,

    j'ai codé cette méthode il y a un certain temps, mais je m'interroge sur son utilité :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function validString($string):bool
        {
            $pattern = '~[^[:alnum:]]~';
     
            $valid = preg_replace($pattern, '', $string);//on retire ts les car.  non alphanumériques
     
            return ( ctype_alnum($valid) );
        }

    Etes-vous bien d'accord que cette condition ctype_alnum($valid) sera toujours vraie ? Et que donc la méthode retournera toujours true (donc ne sert à rien) ?
    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 848
    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 848
    Points : 6 535
    Points
    6 535
    Par défaut
    La première chose qui ne va pas c'est que tu mélanges validation et sanitization. Une méthode dont l'objet est la validation ne doit s'en tenir qu'à ça à mon avis. (donc exit le preg_replace).
    Ensuite considère ce qui se passe lorsque la chaîne est vide (ou qu'elle ne contient aucun caractère alphanumérique).
    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 339
    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 339
    Points : 5 723
    Points
    5 723
    Billets dans le blog
    1
    Par défaut
    Même si ce code, c'est n'importe quoi, je crois que mon idée était de retirer par preg_replace les caractères autorisés puis de tester si le résultat est vide ou pas. Ca tient pas la route cette approche ?
    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 848
    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 848
    Points : 6 535
    Points
    6 535
    Par défaut
    Ton idée de départ était de retirer les caractères non-autorisés puis de renvoyer le résultat de ctype_alnum() (qui renverra toujours true sauf si la chaîne modifiée est vide).
    Je ne vois pas trop quel est l'intérêt par rapport à une simple test avec ctype_alnum().
    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 339
    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 339
    Points : 5 723
    Points
    5 723
    Billets dans le blog
    1
    Par défaut
    Tout à fait d'accord avec toi que le code du post #1 ne présente que l'intérêt (discutable) de se compliquer la vie.

    Je cherche une solution pour qu'on accepte que les caractères alphanumériques et -,_,. (par exemple) :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function validString($string):bool
    {
            $pattern = '~[:alnum:,\_,\-,\.]~';
     
            return ( preg_match($pattern, '', $string) ) ;
    }
    (idée générale mais pas au point car marche pas).
    Pourrais-tu me corriger ?
    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
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 750
    Points : 2 973
    Points
    2 973
    Par défaut
    Je parie qu'il y aura encore des gens qui vont dire "ouais, les regex, c'est compliqué, c'est pour le geek, ... etc" (je blague).

    Une regex, c'est pas si difficile et surtout si tu utilises ton meilleur ami, j'ai cité regex101.com; va voir https://regex101.com/r/bPIfjr/1/

    Pour un exemple : http://sandbox.onlinephpfunctions.co...4c15481b2881f5

    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
    <?php
     
    echo "Il n'y a pas d'accent, devait être correct \n";
     
    $pattern = '/^[A-Za-z0-9-_\.]*$/';
    $string = 'Il-etait-une-fois-9-canards';
     
    printf("   Résultat: %s\n", preg_match($pattern, $string) ? 'Correct!' : 'Oups; incorrect') ;
     
    echo "Cette fois il y a un accent, incorrect \n";
     
    $pattern = '/^[A-Za-z0-9-_\.]*$/';
    $string = 'Il-était-une-fois-9-canards';
     
    printf("   Résultat: %s\n", preg_match($pattern, $string) ? 'Correct!' : 'Oups; incorrect') ;
    Le résultat sera correct pour le premier cas, incorrect pour l'autre.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    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 339
    Points : 5 723
    Points
    5 723
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse.

    En plus, l'ami en question (https://regex101.com/) contient une quick reference qui répond à pas mal de mes questions.

    Y en a quand même pour laquelle j'ai pas trouvé de réponse : pourquoi ce pattern ne marche pas : $pattern = '/^[:alnum:-_\.]*$/'; ?
    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

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 848
    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 848
    Points : 6 535
    Points
    6 535
    Par défaut
    Attention avec cette traîtresse d'ancre de fin de chaîne $ qui laisse passer une nouvelle ligne: exemple.

    Pour y parer, on utilise le modificateur D (Dollar End Only):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '/^[A-Za-z0-9_.-]*$/D';
    mais le mieux est à mon avis d'utiliser les ancres \A et \z qui sont plus explicites (et sans surprise):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '/\A[A-Za-z0-9_.-]*\z/';
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 848
    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 848
    Points : 6 535
    Points
    6 535
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    pourquoi ce pattern ne marche pas : $pattern = '/^[:alnum:-_\.]*$/'; ?
    Parce que c'est $pattern = '/\A[[:alnum:]_.-]*\z/';, les classes de caractères POSIX comme [:alnum:] sont notées entre crochets (en plus de ceux qui délimitent la classe de caractères dans laquelle elles figurent).

    NB: le point n'est pas un caractère spécial au sein d'une classe de caractères, inutile de l'échapper. Mieux vaut placer le tiret au début ou en fin de classe si tu veux éviter de l'échapper (il n'est pas improbable qu'un jour il ne soit plus possible de le placer après un rang comme A-Z sans l'échapper).

    Autre chose [:alnum:] avec le souligné _ correspond à la classe \w, donc on peut écrire la pattern de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '/\A[\w.-]*\z/';
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  10. #10
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    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 339
    Points : 5 723
    Points
    5 723
    Billets dans le blog
    1
    Par défaut
    J'ai remis les ancres \A et \z (que tu m'avais déjà montrées) mais il reste une erreur :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function validString($string):bool
    {
        $pattern = '~\A[A-Za-z0-9_-()\,\. \']*\z~';
     
        return ( preg_match($pattern, $string) ) ;
    }
     
    $str="jj_èkl";
    echo $str."/// validString(".$str.")=".validString($str)."<br/>";

    ( ! ) Warning: preg_match(): Compilation failed: range out of order in character class at offset 14 in C:\projets\dvp\divers\test.php on line 6
    Pourquoi ?
    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

  11. #11
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    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 339
    Points : 5 723
    Points
    5 723
    Billets dans le blog
    1
    Par défaut
    En fouinant un peu, j'ai trouvé que l'erreur venait du non-échappement du tiret.

    Par ailleurs, j'ai simplifié la regex avec le raccourci cité par Cosmo et en enlevant 2 échappements inutiles : $pattern = '/\A[\w_(),. \']*\z/';.
    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

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

Discussions similaires

  1. Cette réponse est-elle valide par rapport à ce WSDL ?
    Par nicolas_isi dans le forum Services Web
    Réponses: 1
    Dernier message: 17/09/2016, 10h53
  2. Désactiver la validation par ENTER
    Par sami_c dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 05/06/2006, 11h44
  3. [Javascript] Form. valider par js, comment prevoir si js pas activé
    Par budiste dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/03/2006, 17h42
  4. [HTML][checkbox] valider par défault
    Par hutchuck dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 28/11/2005, 12h44
  5. Buotons radios avec validation par boite de dialogue
    Par alexbubs dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/10/2005, 19h21

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