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 :

expression régulière regex PCRE [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    en étude de webmaster
    Inscrit en
    février 2016
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : en étude de webmaster

    Informations forums :
    Inscription : février 2016
    Messages : 125
    Points : 56
    Points
    56
    Par défaut expression régulière regex PCRE
    Bonjour.
    J'ai fait une condition avec une regex PCRE pour vérifier le numéro de téléphone et je ne comprend pas où ça bug.
    L'expression régulière me semble juste. le but c'est que ça permette une numéro comme ceci: 022 772 89 34
    avec soit des point, soit des espaces, soit des tiret et un / entre 022 et 772
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(FALSE === isset($_POST["telephone"])){
            $_POST['telephone'] = htmlspecialchars($_POST['telephone']);
            $message_erreur[] = "Pas de numéro de télépnone reçu";
        }
    elseif (preg_match("#^02[1-9][-. /]?[1-9]{3}([-. ]?[0-9]{2}){4}$#", $_POST["telephone"])){
            $message_erreur[] = "Vous devez entré un numero de telephone correcte";
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input id="telephone" name="telephone" type="text" class="validate"/>
    <label for="telephone" class="grey-text text-darken-4">Téléphone</label>

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 438
    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 438
    Points : 5 388
    Points
    5 388
    Par défaut
    Tout d'abord:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(FALSE === isset($_POST["telephone"])){ // pas besoin d'une égalité stricte, isset renvoie soit true soit false
                                              // donc if ( !isset($_POST['telephone']) ) { est suffisant
        $_POST['telephone'] = htmlspecialchars($_POST['telephone']); // À quoi sert cette ligne? 
                                                                     // $_POST['telephone'] n'est pas défini, tu ne peux pas l'utiliser.
        $message_erreur[] = "Pas de numéro de télépnone reçu";
    }
    Ensuite pour ta pattern, tu dis vouloir vérifier un numéro avec le format 022 772 89 34, alors pourquoi répéter 4 fois ([-. ]?[0-9]{2}){4}? Deux fois devrait suffire.
    Autre chose, quand tu utilises l'ancre $ pour la fin de chaîne, ajoute aussi le modificateur D, ou bien remplace $ par \z car sinon un caractère \n pourrait traîner à la fin de la chaîne et la pattern n'y verrait que du feu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    elseif ( !preg_match("#^02[1-9][-. /]?[1-9]{3}([-. ]?[0-9]{2}){2}$#D", $_POST["telephone"]) ) {
        $message_erreur[] = "Vous devez entrer un numéro de téléphone correct";
    }
    Est-ce que tu confirmes que le zéro n'est pas autorisé dans le deuxième groupe de trois chiffres et est-ce que le numéro peut être entré sans aucun séparateur?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre du Club
    Homme Profil pro
    en étude de webmaster
    Inscrit en
    février 2016
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : en étude de webmaster

    Informations forums :
    Inscription : février 2016
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    // donc if ( !isset($_POST['telephone']) ) { est suffisant
    c'est comme ça que j'ai appris, mais je sais que ! suffit.

    $_POST['telephone'] = htmlspecialchars($_POST['telephone']);
    sert a ce que j'ai vus empêcher de mettre des caractère spécial comme <> (il me semble)


    $_POST['telephone'] n'est pas défini, tu ne peux pas l'utiliser.
    si il est défini dans l'input, j'ai pas mis tout le formulaire.

    Est-ce que tu confirmes que le zéro n'est pas autorisé dans le deuxième groupe de trois chiffres et est-ce que le numéro peut être entré sans aucun séparateur?
    Je confirme.

  4. #4
    Membre du Club
    Homme Profil pro
    en étude de webmaster
    Inscrit en
    février 2016
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : en étude de webmaster

    Informations forums :
    Inscription : février 2016
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    Nom : Screenshot-2017-10-21 La Coute Paille.png
Affichages : 108
Taille : 15,8 Ko
    pourtant voilà ce que je peux envoyer comme numéro de téléphone, vus le regex je ne devrais pas pouvoir.
    Il devrait me donner le message d'erreur
    Vous devez entrer un numéro de téléphone correct

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 438
    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 438
    Points : 5 388
    Points
    5 388
    Par défaut
    Dans tous les cas, tu n'as pas besoin d'utiliser htmlspecialchars où que ce soit car quand $_POST['telephone'] n'est pas défini, il n'y a rien à échapper, et quand il l'est, tu connais les caractères présents dans la chaîne puisque tu l'as contrôlée avec preg_match. Tu peux enlever cette ligne, elle ne sert à rien et provoquera un undefined offset.

    Ce n'est pas parce que tu as une balise <input name="telephone" type="text" /> dans ton formulaire qu'arrivé dans ton code php, $_POST['telephone'] va être forcément défini. Garde en tête que rien ne prouve que les données reçues par ton script PHP proviennent bien de ton formulaire. D'ailleurs si c'était le cas, pourquoi tester avec isset?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 438
    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 438
    Points : 5 388
    Points
    5 388
    Par défaut
    Je viens de me rendre compte que le elseif teste ( preg_match... ) au lieu de ( !preg_match... ). Voilà le problème.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Membre du Club
    Homme Profil pro
    en étude de webmaster
    Inscrit en
    février 2016
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : en étude de webmaster

    Informations forums :
    Inscription : février 2016
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    ben je sais pas où est le problème, alors je te met tout le code php.
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    if($_SERVER['REQUEST_METHOD'] == 'GET'){
        // variable booleene qui indiquera si on affiche ou pas le formulaire
        $affiche_formulaire = true;
        //je cree une variable vide qui apparaitra si il y des messages d'erreur
        $message = "";
    }
    else if($_SERVER['REQUEST_METHOD'] == 'POST'){
    /*Je vérifie si l'adresse de l'e-mail n'a pas ete reçu*/
        if(FALSE === isset($_POST["telephones"])){
     
            $message_erreur[] = "Pas de numéro de télépnone reçu";
     
        }/*Je vérifie si le numéro est correctment rentré*/
        elseif (preg_match("#^02[1-9][-. /]?[1-9]{3}([-. ]?[0-9]{2}){2}$#D", $_POST["telephones"])){
     
            $message_erreur[] = "Vous devez entrer un numéro de téléphone correct";
     
        }
    if(empty($message_erreur)){
     
            $telephone = ($_POST["telephones"]);
            $message_recapitulatif[] .= "Telephone: ".$telephone;
     
            $message = 'Voici le récapitulatif de votre résevation <br />'.implode('<br />', $message_recapitulatif);
     
            // le formulaire ne sera pas réaffiché
            $affiche_formulaire = true;
     
        } // sinon
        else {
     
            // on fabrique un message d'erreur
            $message = implode("<br/> ", $message_erreur);
     
            // on reaffiche le formulaire
            $affiche_formulaire = TRUE;
     
        }}
    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
    <?php echo $message; ?>
            <?php if($affiche_formulaire){ ?>
            <form action="menus.php" method="post" enctype="multipart/form-data">
    <div class="row">
                    <div class="input-field col s12 m6 l6">
                        <i class="material-icons prefix">phone</i>
                        <input id="telephone" name="telephones" type="text" class="validate"/>
                        <label for="telephone" class="grey-text text-darken-4">Téléphone</label>
                    </div>
                    <div class="input-field col s12 m6 l6">
                        <i class="material-icons prefix">email</i>
                        <input id="email" name="mails" type="email" class="validate"/>
                        <label for="email" data-error="wrong" data-succes="right" class="grey-text text-darken-4">E-mail</label>
                    </div>
                </div>
    </form>
    <?php } ?>

  8. #8
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : janvier 2006
    Messages : 1 769
    Points : 2 403
    Points
    2 403
    Par défaut
    sans répondre sur la validité de l'expression réguliere (pour mettre au point, ya des outils en ligne qui sont utiles parce que ça nous débarasse du code de gestion de l'appel preg_match)

    justement quand je compare le manuel de l'expression preg_match
    Citation Envoyé par le manuel
    preg_match() retourne 1 si le pattern fourni correspond, 0 s'il ne correspond pas, ou FALSE si une erreur survient.
    et ta condition, je me dit que la ligne 17 de ton exemple ne contient pas le bon commentaire.

    En plus tu passes par une variable relais (ici $message_erreur oubien c'est $message, j'ai pas compris) et un empty() sur un tableau ou une variable non initialisée. Pas terrible. Si tu tiens à mettre une variable relais au lieux de d'appeler une fonction (ou des else imbriqués), utilise un bouleen initialisé par défaut et une 2e variable pour le message.

    Enfin, une fois que tu auras résolu le bug de la ligne de la ligne 17, réfléchi à reprendre ton code avec un filter_var ou filter_array, j'aime pas trop manipuler $_POST dans mon code, comme il faut partir du principe que c'est une entree utilisateur, j'ai pas à la modifier mais j'ai à m'en méfier (donc je la recopie en la nétoyant (suppression des symboles binaires notement).

    par exemple je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function sanitize_form1( $unsafe ){
      return filter_array($unsafe, ...);
    }
    //et ensuite pour récuperer sur POST
    $safe=sanitize_form1($_POST);
     
    //et si je veux supporter  $_GET
    $safe=sanitize_form1($_GET);
     
    //et si je veux les deux
    $safe=sanitize_form1($_REQUEST);
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  9. #9
    Membre du Club
    Homme Profil pro
    en étude de webmaster
    Inscrit en
    février 2016
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : en étude de webmaster

    Informations forums :
    Inscription : février 2016
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    (pour mettre au point, ya des outils en ligne qui sont utiles parce que ça nous débarasse du code de gestion de l'appel preg_match)
    Est-ce que tu aurais un outils en ligne a me conseiller.

  10. #10
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : janvier 2006
    Messages : 1 769
    Points : 2 403
    Points
    2 403
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  11. #11
    Membre du Club
    Homme Profil pro
    en étude de webmaster
    Inscrit en
    février 2016
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : en étude de webmaster

    Informations forums :
    Inscription : février 2016
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    merci pour vos conseil et votre aide,
    Je me suis rendu compte que ce qu'il me manquait dans ma regex pour qu'elle fonctionne c'est ==FALSE.
    Je met en dessous la regex qui marche au cas où ça intéresserai quelqu'un.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    elseif ((preg_match("#^0[27][1-9][-. /]?[1-9]{3}([-. ]?[0-9]{2}){2}$#D", $_POST["telephone"])) == FALSE){
            $message_erreur[] = "Vous devez entrer un numéro de téléphone correct";
        }

  12. #12
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 438
    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 438
    Points : 5 388
    Points
    5 388
    Par défaut
    Oui, c'est peu ou prou ce que j'ai écrit dans le message #6 (et corrigé dans le message #2).
    preg_match renvoie false quand la recherche génère une erreur, quand la correspondance n'est pas trouvée, preg_match retourne 0 (cf le message #8 de gene69). Donc si tu choisis d'écrire explicitement une égalité, mieux vaut le faire avec une égalité stricte à 0:if ( preg_match(...) === 0 ) {.
    Dans cette perspective écrire: if ( preg_match(...) == false ) { marchera, car le 0 est transtypé en booléen, mais n'a pas trop de sens. Ceci dit, écrire if ( !preg_match(...) ) { fait exactement la même chose (le transtypage de 0 à false), mais le mot false n'apparaît pas (ce qui met le lecteur à l'abri de pensées subversives). Mais ce n'est pas grave d'un point de vue fonctionnel car ce genre de pattern ne provoquera jamais d'erreurs et ne renverra jamais false.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  13. #13
    Membre du Club
    Homme Profil pro
    en étude de webmaster
    Inscrit en
    février 2016
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : en étude de webmaster

    Informations forums :
    Inscription : février 2016
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    Pourquoi dans ma regex
    [27]
    le 7 ne marche pas, mais uniquement 2.
    Alors que c'est une condition "ou".

  14. #14
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    avril 2007
    Messages
    8 632
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2007
    Messages : 8 632
    Points : 16 367
    Points
    16 367
    Par défaut
    Définis "le 7 ne marche pas". Ta regex matche "071 851 12 22" pour moi.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  15. #15
    Membre du Club
    Homme Profil pro
    en étude de webmaster
    Inscrit en
    février 2016
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : en étude de webmaster

    Informations forums :
    Inscription : février 2016
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    ben chez moi il me donne le message d'erreur si je tape 079 444 77 28
    par contre si je tape 022 793 72 43 il me le passe comme correcte.

  16. #16
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    avril 2007
    Messages
    8 632
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2007
    Messages : 8 632
    Points : 16 367
    Points
    16 367
    Par défaut

    Le code suivant fonctionne pour moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $re = '@^0[27][1-9][-. /]?[1-9]{3}([-. ]?[0-9]{2}){2}$@D';
    $str = '079 444 77 28';
     
    preg_match_all($re, $str, $matches);
     
    // Print the entire match result
    var_dump($matches);
    Tu tapes la chaîne à la main, sans espaces en trop ? ce n'est pas un copier-coller bancal ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  17. #17
    Membre du Club
    Homme Profil pro
    en étude de webmaster
    Inscrit en
    février 2016
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : en étude de webmaster

    Informations forums :
    Inscription : février 2016
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    non je tape la chaine à la main.

    Merci quand même.

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

Discussions similaires

  1. Expression régulière (regex)
    Par ClarusAD dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/06/2017, 14h45
  2. Expression régulière (regex) pour tester le format d'un password
    Par steph68b dans le forum Général JavaScript
    Réponses: 31
    Dernier message: 11/03/2016, 14h59
  3. Expression régulière (regex)
    Par narutoe dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 04/06/2011, 14h04
  4. Réponses: 11
    Dernier message: 07/04/2010, 17h51
  5. pb avec expression régulière (regex)
    Par rudhf dans le forum C#
    Réponses: 12
    Dernier message: 10/05/2007, 15h20

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