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 :

Vérifier champs vide, chaîne de caractères, un seul mot. [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut Vérifier champs vide, chaîne de caractères, un seul mot.
    Bonjour,

    Je débute en PHP, j'ai fais une petite page html qui demande d'entrer un mot dans un champ.

    Avant d'envoyer le formulaire vers le serveur, je voudrais vérifier:
    • que le champ est bien rempli.
    • que ça soit une chaine de caractère (pas de chiffre)
    • qu'il n'y ai que un seul mot dans le champs.


    La seul vérification qui fonctionne pour le moment, c'est que le champs soit bien rempli.

    html
    Code HTML : 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
    <!DOCTYPE html>
    <html lang="fr">
    <head>
        <meta charset="UTF-8">
        <title>Test PHP</title>
        <script src="jquery-3.4.1.min.js"></script>
        <script src="script.js"></script>
    </head>
    <body>
        <form method="post" action="traitementAjax.php">
            <p>Entrer un mot:<input type="text" name="mot" id="mot" autofocus/><button type="submit" id="submit">Submit</button></p>
            <div id="responseAjax"></div>
        </form>
     
    </body>
    </html>

    responseAjax.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
    <?php 
    $mot = mb_strtoupper($_POST["mot"]);
     
    //expressions régulières
    if (empty($mot)) {//si le champs est vide
        $errors['emptyField'] = "Veuillez remplir le champs!";
    } elseif (preg_match (" ^\w+$ ", $mot)) {//test chaine de caractère
        $errors['onlyChars'] = "Votre mot ne peut contenir que des caractères";
    }else {
        echo trim($mot);//un seul mot
    }
     
    // pour afficher les msg d'erreur
    foreach($errors as $error) {
        echo $error;
    }
     
    //écriture dans fichier texte
    $fp = fopen('data.txt','a+');
    fwrite($fp,$mot);
    fclose($fp);
    ?>
    script.js
    Code JavaScript : 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
    "use strict";
     
    //Avec ajax
    $(document).ready(function() {
        $("#submit").click(function(e) {
            e.preventDefault();//c'est l'équivalente de return false
            var mot = $("#mot").val();
                $.ajax({
                    method: "POST",//method au lieu de type
                    url: "traitementAjax.php",
                    data: {"mot":mot},//envoyer les données en tant qu'objet javascript {}
                    cache: false
                })
                .done(function(result){//utiliser done au lieu de success
                       $("#responseAjax").html(result).hide().fadeIn(2000);//apparait progressivement
                })
                .fail(function(err){//utiliser fail pour voir si y'a des erreurs...
                       alert('Erreur ajax :'+err);
                })      
        });
    });

    pour le deuxième test, chaine de caractère, j'ai l'erreur suivante.
    Nom : erreur.PNG
Affichages : 575
Taille : 21,1 Ko

    Peut-être que quelqu'un de plus aguerri avec PH et surtout avec les expressions régulières saura me mettre sur la bonne voie.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    quand vous avez un résultat inattendu avec une fonction, la 1re chose à voir est la documentation en allant à l'adresse "php.net/" + nom de la fonction.
    là pour l'utilisation des expressions régulières, regardez les exemples de cette page https://php.net/preg_match

    et regardez aussi la documentation concernant spécialement les expressions régulières : https://www.php.net/manual/fr/pcre.pattern.php

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    J'ai fait comme ceci.

    traitementAjax.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
    <?php 
    //include ('css/style.css');
    $mot = mb_strtoupper($_POST["mot"]);
     
    if (empty($mot)) {//si le champs est vide
        echo '<script type="text/javascript">' . 'alert("Veuillez remplir le champs!");' . '</script>';
    } elseif (!preg_match ("/^[a-zA-ZÀ-ÖØ-öø-ÿœŒ]+$/", $mot)) {//chaine de caractères et un seul mot
        echo '<script type="text/javascript">' . 'alert("Votre mot ne doit contenir que des lettres et un seul mot");' . '</script>';
    }else {
        echo trim($mot);//un seul mot
    }
     
     
     
    //écriture dans fichier texte
    $fp = fopen('data.txt','a+');
    fwrite($fp,$mot);
    fclose($fp);
    ?>

  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
    Il y a du progrès mais ça reste faux, car si je fais quelques tests diaboliques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function test($mot) {
        return preg_match ("/^[a-zA-ZÀ-ÖØ-öø-ÿœŒ]+$/", $mot); 
    }
     
    var_dump(test("\xc3")); // int(1)
    var_dump(test('×')); // int(1)
    var_dump(test("abcd\n")); // int(1)
    J'obtiens trois matches, alors que je ne devrais en avoir aucun.

    L'origine du problème est que la pattern est lue par défaut octet par octet, ce qui fait que par exemple À-Ö n'est pas vu comme le rang de caractères unicode allant de À (c3 80 en utf8) jusqu'à Ö (c3 96 en utf8), mais comme \xc3 puis le rang \x80-\xc3 puis \x96. Idem pour Ø-ö et ø-ÿ, mais aussi pour œ et Œ qui sont également encodés sur plusieurs octets. Avec tout ces octets disponibles dans la classe de caractères agrémentée du quantificateur +, rien ne m'empêche de composer le caractère × (U+00D7 MULTIPLICATION SIGN) avec \xc3 et \x97 qui sont tout deux contenus dans le rang \x80-\xc3.

    Pour pallier à ce premier problème, il suffit d'utiliser le modificateur u qui, entre autres, indique que la pattern et la chaîne sujet doivent être lus en utf8. Donc /^[a-zA-ZÀ-ÖØ-öø-ÿœŒ]+$/u.

    Deuxième problème: l'ancre de fin de chaîne $. Cette ancre marque la fin de chaîne, mais aussi la fin de chaîne avant un saut de ligne final (c'est une flexibilité utile dans le traitement de fichiers où on ne sait pas toujours si l'auteur a appuyé sur entrée (ou le logiciel a inséré un LF) ou pas à la fin de la dernière ligne). C'est pourquoi la chaîne "abcd\n" réussit alors qu'elle ne devrait pas.
    Deux solutions:
    • soit on utilise le modificateur D pour forcer $ à réussir uniquement à la fin de la chaîne: /^[a-zA-ZÀ-ÖØ-öø-ÿœŒ]+$/uD
    • soit on utilise le couple d'ancres \A et \z: /\A[a-zA-ZÀ-ÖØ-öø-ÿœŒ]+\z/u
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. [11gR1] Une regex pour formater une chaine de caractères
    Par akkyshan dans le forum PL/SQL
    Réponses: 6
    Dernier message: 11/02/2014, 17h27
  2. [Batch] Vérifier si une chaine de caractères est présente dans un fichier
    Par jp_____ dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 23/08/2013, 10h40
  3. vérifier champ vide
    Par info.pascal dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/01/2013, 15h47
  4. Vérifier qu'une chaine de caractère est bien présente
    Par kilian67 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 28/09/2007, 18h10
  5. Vérifier champ de formulaire et caractères interdits
    Par rekiem71 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/04/2007, 17h45

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