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 :

Filtrer un nom qui doit commencer par la lettre q et doit uniquement être suivi de chiffres? [RegEx]


Sujet :

Langage PHP

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 097
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 097
    Points : 944
    Points
    944
    Par défaut Filtrer un nom qui doit commencer par la lettre q et doit uniquement être suivi de chiffres?
    Bonjour,
    Je suis null avec les regex et je cherche à enregistrer des réponses dans une base de données.
    Le $_POST a d'autres réponses comme, nom, prénom, etc, mais les réponses à des questions-jeux commence par q.

    Exple
    q1
    q2
    q3
    q4
    q5

    J'aimerais donc filtrer ceci du $_POST

    Je pense qu'un départ comme ceci, pourrait aider?

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(preg_match("/[q]{1}[0-9][1-2]/,$_POST['name])")
    {
     // OK
    }
    Doit contenir uniquement le q en minuscule et 1 à 2 chiffres après le q.

    Comment pourrais-je faire ceci?

    Merci

  2. #2
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 097
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 097
    Points : 944
    Points
    944
    Par défaut
    J'arrive a ceci sans trop de succès

    Il n'est autorisé que d'avoir la lettre q et un ou deux des chiffres après le q.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	$toto = "q1";
    	echo preg_match("/(^q.{1})([0-9]{1,2})$/",$toto);
    	echo preg_match("/^q.{1}/",$toto);
    	echo preg_match("/([0-9]{1,2})$/",$toto);
    m'affiche: 011, mais devrait m'affiche 111

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	$toto = "q12";
    	echo preg_match("/(^q.{1})([0-9]{1,2})$/",$toto);
    	echo preg_match("/^q.{1}/",$toto);
    	echo preg_match("/([0-9]{1,2})$/",$toto);
    M'affiche: 111 (parfait)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	$toto = "q123";
    	echo preg_match("/(^q.{1})([0-9]{1,2})$/",$toto);
    	echo preg_match("/^q.{1}/",$toto);
    	echo preg_match("/([0-9]{1,2})$/",$toto);
    M'affiche : 111 mais devrait m'afficher 010

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 097
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 097
    Points : 944
    Points
    944
    Par défaut
    Ou pour simplifier,
    on peut dire que le premier digit doit etre un q minuscule et dès le deuxième digit, il ne doit contenir que des nombres uniqumenet

  4. #4
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 092
    Points : 16 606
    Points
    16 606
    Par défaut
    Salut

    ([q]{1}[0-9]{1,2})[[:blank:]] il me semble.
    Un lien utile: Tester RegExe en ligne et debuger

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 097
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 097
    Points : 944
    Points
    944
    Par défaut
    Non ca ne marche pas.
    Super le lien. Grace a celui-ci, j'ai trouvé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $toto = "q4";
    echo preg_match("/(^q.{1}[0-9]{0,1}$)/",$toto);
    si je mets plus de 3 nombre,
    si je met une letre à la fin
    si je change q
    il retourne 0

    Merciii

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    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 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $toto = "q4";
    echo preg_match("/(^q.{1}[0-9]{0,1}$)/",$toto);
    Et non, c'est encore faux! Le point . représente n'importe quel caractère, donc cette pattern acceptera aussi bien l'entrée qX4.
    D'une manière générale, le quantificateur {0,1} peut-être remplacé par le point d'interrogation qui signifie la même chose, et le quantificateur {1} n'est jamais nécessaire (quelque soit la pattern, les circonstances et l'âge du capitaine) car tout élément dans une pattern y est une fois par défaut. Les parenthèses sont inutiles, il n'y a rien à grouper ou à capturer.

    Autre chose, méfiance avec l'ancre de fin de chaîne $ car celle-ci peut réussir dans deux cas:
    • à la fin de la chaîne (comme on peut s'y attendre)
    • mais aussi avant la fin de la chaîne, juste avant une séquence de nouvelle ligne qui conclue la chaîne:
      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
      16
      17
      18
      19
      20
      21
      22
      $i = 1; // toutes ces patterns réussissent
       
      if ( preg_match('~^\d{3}$~', "123", $match) )
          echo $i++, ') ', $match[0], PHP_EOL; // 123 (comme on peut s'y attendre)
       
      if ( preg_match('~^\d{3}$~', "123\n", $match) ) // séquence de nouvelle ligne UNIX 
          echo $i++, ') ', $match[0], PHP_EOL; // 123 (et pourtant ce n'est pas la fin de la chaîne)
       
      // même comportement si je modifie la séquence de nouvelle ligne par défaut    
      if ( preg_match('~(*CR)^\d{3}$~', "123\r", $match) ) // séquence de nouvelle ligne Apple jusqu'à Mac OS9 
          echo $i++, ') ', $match[0], PHP_EOL; // 123 
       
      if ( preg_match('~(*CRLF)^\d{3}$~', "123\r\n", $match) )  // séquence de nouvelle ligne Microsoft, mais aussi AMSTRAD CPC, PALM OS, OS/2 et PC DOS.
          echo $i++, ') ', $match[0], PHP_EOL; // 123 
       
      if ( preg_match('~(*NUL)^\d{3}$~', "123\x00", $match) ) // fin de chaîne C
          echo $i++, ') ', $match[0], PHP_EOL; // 123 
       
      if ( preg_match('~(*ANY)^\d{3}$~', "123\x85", $match) ) // ANY signifie n'importe quelle séquence de saut de ligne (y compris les précédentes). \x85 correspond au caractère NEL utilisé sur les systèmes mainframe z/OS et i5/OS d'IBM 
          echo $i++, ') ', $match[0], PHP_EOL; // 123
       
      // il en existe d'autres plus exotiques encore comme le séparateur de ligne LS (U+2028) ou le séparateur de paragraphes PS (U+2029) qui seront identifiées avec (*ANY)
      demo.

      Pour contrer cet aspect de $ on peut soit ajouter le modificateur D (Dollar end only) en fin de pattern, soit ne pas utiliser $ et lui préférer \z qui lui matche toujours la fin de la chaîne. (On peut de même changer ^ pour \A dont le comportement ne change pas même avec le modificateur m qui permet de travailler ligne par ligne).


    Donc pour une chaîne qui commence par q avec un nombre de un à deux chiffres, on peut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( preg_match('~^q[1-9][0-9]?$~D', $str) ) {
        //...
    }
    ou encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( preg_match('~\Aq[1-9][0-9]?\z~', $str) ) {
        //...
    }
    NB: tant que l'on utilise pas le modificateur u qui étend sa signification à tout l'unicode (soient les chiffres dans n'importe quel alphabet), [0-9] peut être remplacé par \d.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/06/2013, 15h25
  2. affichage des enregistrements qui commencent par une lettre donnée
    Par kroma23 dans le forum Bases de données
    Réponses: 4
    Dernier message: 14/10/2011, 09h08
  3. Réponses: 5
    Dernier message: 12/03/2010, 11h03
  4. Afficher des noms qui commencent par une lettre donnée
    Par kroma23 dans le forum Bases de données
    Réponses: 1
    Dernier message: 22/11/2008, 16h48
  5. Réponses: 3
    Dernier message: 07/11/2007, 09h55

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