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 :

accepter les caractères alphanumériques plus d'autres caractères [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 accepter les caractères alphanumériques plus d'autres caractères
    Bonjour,
    si on veut juste tester qu'une chaîne ne contient que des caractères alphanumériques, y a la fonction ctype_alnum mais comme je veux aussi accepter un autre caractère, je pense qu'il faut passer par une regexp. Sauf que là, j'y connais très peu et que j'ai pas la bonne regexp...Voici mon code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     $pattern = "/\A[0-9][a-z][A-Z][_]\z/";
            if ( !preg_match( $pattern, $this->applicationname ) )
            {
                $this->errors[] = "For SESA = " . $this->sesaid . " and application = " .  $this->applicationname .
                    ", " . $this->applicationname . " does not belong only alphanumeric or _ characters ";
                   }
    Peut-on me corriger ? (avec cette regexp, ça signale une erreur même pour une chaîne correcte)
    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
    Tu t'es souvenu de \A et \z, c'est bien on avance!

    Maintenant les classes de caractères: Chaque classe [...] vaut pour un seul caractère (parmi ceux qui sont représentés dans la classe), donc \A[0-9][a-z][A-Z][_]\z réussira uniquement avec d'une chaîne de longueur de 4 caractères exactement avec dans l'ordre un chiffre, une lettre minuscule, une majuscule et un souligné. Par exemple 0aX_ ça devrait marcher mais pas a0X_ (pas le bon ordre), ou 0aX_1 (pas la bonne longueur).

    Bref, tu dois placer tous les caractères autorisés dans une seule et même classe de caractères par exemple [0-9a-zA-Z_] et indiquer le nombre d'occurrences possibles avec un quantificateur:
    • * (de 0 à l'infini)
    • + (de 1 à l'infini)
    • {m,n} (de m à n)


    Ce qui donne \A[0-9a-zA-Z_]+\z pour une chaîne d'au moins un caractère.

    Il se trouve que l'association des caractères [0-9a-zA-Z_] dans une même classe est très utilisée, et de ce fait, il existe une manière plus rapide de l'exprimer: \w (w pour "word character").

    Donc on peut écrire la pattern: \A\w+\z.




    Mais on peut aussi tester le contraire: si la chaîne contient un caractère qui n'est pas de cette classe (donc on enlève le ! avant preg_match ainsi que les ancres \A et \z puisque ce caractère peut se trouver n'importe où dans la chaîne):

    (À noter que dans ces deux cas, rien ne garantit que la chaîne testée ait une quelconque longueur ou ne soit pas vide.)




    Il existe aussi une notation dans le style POSIX de la classe \w, il s'agit de [[:word:]] (avec pour complémentaire [^[:word:]]). Cette classe se retrouve dans pas mal d'implémentations dont celle du moteur de regex de PHP, mais ne figure pas dans la norme POSIX.
    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
    Salut Cosmo,

    voulant changer le moins possible le code existant, je n'ai pas voulu tester le contraire (avec ^ au début de la REGEXP). Finalement, le raccourci \w ne me convient pas car j'ai vu que je devais aussi accepter pleins d'autres caractères, donc finalement, ma REGEXP est /\A[0-9a-zA-Z_\-(),.' ]+\z/" (j'ai aussi vu qu'il fallait échapper le caractère -).

    Autre point : il ne faut pas remonter une erreur si la valeur à tester est vide, donc mon code PHP est du genre
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     $pattern = "/\A[0-9a-zA-Z_\-(),.' ]+\z/";
    if ( !preg_match( $pattern, $this->applicationname ) && !empty( $this->applicationname ))
    {
        $this->errors[] = "For SESA = " . $this->sesaid . " and application = " .  $this->applicationname .
        ', "' . $this->applicationname . '" (column applicationname) does not belong only alphanumeric character or one of these characters: _ - ( ) , . \'  (the last one beeing a space)';
    }
    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
    Pourtant tu peux très bien, utiliser le raccourci \w à l'intérieur de crochets avec d'autres caractères, et en utilisant la version "négative" de la classe de caractères, tu peux te passer de empty:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( preg_match( "/[^\w(),.' -]/", $this->applicationname ) ) {
        $this->errors[] = "For SESA = " . $this->sesaid . " and application = " .  $this->applicationname .
        ', "' . $this->applicationname . '" (column applicationname) does not belong only alphanumeric character or one of these characters: _ - ( ) , . \'  (the last one beeing a space)';
    }
    Effectivement, le tiret doit être échappé dans une classe de caractères car il permet de définir les rangs de caractères (comme a-z), mais il y a des exceptions:
    • au début de la classe [-......]
    • au début après le caractère de négation [^-.....]
    • à la fin de la classe [......-]
    • avec PHP < 7.3, après un raccourci de classe de caractère: [\w-.....], mais à partir de PHP 7.3, on obtient une erreur invalid range

    L'échappement du tiret à ces positions ne génère pas d'erreur (l'échappement est ignoré). Mais bon si tu veux que ta pattern ne ressemble à une tranche de pâté, autant éviter les échappements inutiles.
    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
    Bonsoir,

    je croyais avoir répondu y a un moment...

    J'ai "acheté" ta solution :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            $pattern = "/[^\w(),.' -]/";
            if ( preg_match( $pattern, $this->applicationname ) )
            {
                $this->errors[] = "For SESA = " . $this->sesaid . " and application = " .  $this->applicationname .
                    ', "' . $this->applicationname . '" (column applicationname) does not belong only alphanumeric character or one of these characters: _ - (  )  ,  .  \'   (the last one beeing a space)';
    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 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
    Bonsoir,

    j'ai encore un souci et donc j'ai décoché . En fait, il faut aussi accepter le caractère " (guillemet). J'ai tenté $pattern = '/[^\w(),.'" -]/'; et $pattern = '/[^\w(),.'\" -]/'; mais aucune des 2 REGEXP ne fonctionne. Comment faut-il 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

  7. #7
    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
    Ce n'est pas un problème de regex. Il faut faire comme avec n'importe quelle chaîne de caractères: échapper le quote utilisé pour l'encadrer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '/[^\w(),.\'" -]/';
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    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
    Merci pour la réponse nocturne !

    J'avais pensé à échapper mais je crois que je l'avais fait sur un autre fichier...
    Finalement, j'échappe les simples quotes et les doubles quotes :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
            $pattern = "/[^\w(),.\'\" -]/";
    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

  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    l'autre soluce c'est de remplacer les caractères spéciaux autorisés par rien et tester comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (ctype_alpha(str_replace(['(', ')', ',', '.', "'", '"', ' ', '-', '_'], '', $this->applicationname))) {
        // nom valide
    } else {
        // nom invalide
    }

  10. #10
    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
    Merci mais dans mon cas, il vaut mieux ctype_alnum que ctype_alpha...
    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 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
    Citation Envoyé par laurentSc Voir le message
    je crois que je l'avais fait sur un autre fichier...
    Pour éviter que ça reproduise, j'ai eu l'idée (un peu tard) d'utiliser le mécanisme de l'héritage.

    Code php : 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
    class jobClass
    {
            public function validString($string):bool
        {
            return ( (ctype_alnum(str_replace(['(', ')', ',', '.', "'", '"', ' ', '-', '_'], '', $string))) ||( empty
                ($string) ) );
        }
    }
     
     
    class Application extends jobClass
    {
      public function isValid():bool {
     
            if ( !self::validString($this->applicationname) )
            {
                $this->errors[] = "For SESA = " . $this->sesaid . " and application = " .  $this->applicationname .
                    ', "' . $this->applicationname . '" (column applicationname) does not belong only alphanumeric character or one of these characters: _ - (  )  ,  .  \'   (the last one beeing a space)';
            }
    etc
    y a 3 autres classes que Application qui héritent.
    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. [RegExp] regexp qui accepte les caractères numériques et les tirets
    Par laurentSc dans le forum Général JavaScript
    Réponses: 23
    Dernier message: 22/02/2011, 10h30
  2. Réponses: 3
    Dernier message: 15/06/2007, 14h53
  3. Oracle refuse les chaînes de plus de 4000 caractères
    Par Daeron dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 25/01/2007, 11h31
  4. Réponses: 8
    Dernier message: 13/12/2006, 18h17
  5. JavaScript/Zone de texte : n'accepter que les caractères numériques
    Par arkienou dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/07/2006, 14h16

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