Preg_match

Ce topic a été résolu
kinginventeur

kinginventeur Le 10 septembre 2016 à 20:27 (Édité le 25 janvier 2019 à 17:52)

Bonjour/Bonsoir à tous,

Alors voila , j'aimerai savoir comment prendre uniquement ce que je note dans mon preg_match.
Dans mon cas je veux par exemple " Ma réponse " , donc j'accepte uniquement les lettres , chiffres , espace et les ' é , à , è , etc... ' mais tout le reste je n'accepte pas donc ' \ / < > @ ' etc...

Comment faire ? Car lorsque je fais preg_match("/[a-zA-Z0-9éèà]/", $mavariable). // PS je ne sais pas comment mettre les espaces dans preg_match 😭

Ben même si la personne écris " Ma réponse<>/" Sa fonctionne quand même ... :(

Comment faire pour prendre UNIQUEMENT ce que je demande dans le preg_match et rien d'autre ( En mettant les espaces aussi ) ?

Merci de vos réponse les gens 😀



... "Et si vous pouvez en passant me donner une ptite astuce pour autoriser/bloquer uniquement les espaces sa serai gentil 😋"...
TheOldNoob

TheOldNoob Le 10 septembre 2016 à 21:22

Salut l'ami,

ça fait plaisir, tu doit être le premier que je vois qui cherche pas a faire une vérification avec htmlspecialchars 😉

Montre moi exactement ton code (en utilisent les balise du forum), je te dirais ou il y a un problème dans ton preg-match.
La j'ai déjà bien une idée, mais il me faut ton code complet pour voir si c'est ça ou non.
kinginventeur

kinginventeur Le 10 septembre 2016 à 21:47 (Édité le 10 septembre 2016 à 21:49)

Message supprimer.
kinginventeur

kinginventeur Le 10 septembre 2016 à 21:49 (Édité le 10 septembre 2016 à 21:50)

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8"/>
</head>
<body>
<form method="POST">

    <select name="selection"> <!-- Les question secrétes que l'utilisateur chosis -->
        <option>Question secréte 1</option>
        <option>Question secréte 2</option>
        <option>Question secréte 3</option>
        <option>Question secréte 4</option>
    </select>

    </br>

    <input type="text" name="reponse"/> <!-- Sa réponse secréte qui est censer être proteger -->

    <input type="submit" value="Envoyer" name="envoyerform"/>

</form>
</body>

<?php // A NOTER: Je n'est pas mis la selection des question car ce code n'est qu'un test 😀

    if(isset($_POST['envoyerform'], $_POST['selection'], $_POST['reponse']))
    {
        $reponse = htmlspecialchars($_POST['reponse']);
        if(!empty($reponse))
        {

            if(preg_match("/([A-Z])?[a-z]([0-9])?([àéè])?/", $reponse)) // Je ne sais pas comment mettre les espaces ....
            {
                echo "Votre réponse est correct et va être mis dans la base de donner";
            }
            else
            {
                echo "Réponse inccorect ...";
            }

        }
        else
        {
            echo "Veuillez remplir le champ de votre réponse";
        }
    }else{

    }

?>

</html>

Voila 😀 , alors j'ai fais ce code a la rache . Pour te montrer ce que j'aimerai avoir comme résulat 😀 Merci de m'aider.
TheOldNoob

TheOldNoob Le 10 septembre 2016 à 21:50

bah tu clic avec le bouton gauche de ta souris sur qui est juste au dessus quand tu tape une réponse... puis dedans tu fait un copier/coller de ton code 😀
kinginventeur

kinginventeur Le 10 septembre 2016 à 21:51 (Édité le 10 septembre 2016 à 21:51)

Oui désoler , j'ai trouver juste aprés avoir envoyer mon message ^^'
TheOldNoob

TheOldNoob Le 10 septembre 2016 à 22:12 (Édité le 10 septembre 2016 à 22:20)

Alors, la construction de tes classes est mal fichu.

déjà, je conseil, par convention, d'utilisé les # comme delimiteur pour ton regex

Ensuite, tu peu mettre tout ça, dans une seul classe, ce qui sera plus claire :
"#[a-zA-Z0-9À-ú]?#"
Si tu veux autorisé l'espace tu met ça:

"#[a-zA-Z0-9À-ú ]?#"

Maintenant, si tu veux interdire un caractères, tu utilise ^

"#^[<>ajoute les caractères que tu veux interdire...]#"
Pour ma part, j'utilise le fonctionnement inverse des regex :

 if(!preg_match("#^[a-zA-Z0-9À-ú\.:\!\?\&',\s-]{10,140}#", $post['desc_picture']))
Du coup tout le reste est interdit...
Mais ça fonctionne autant dans ton sens que dans le miens 😀


Sinon, n'hésite pas a lire les deux cours sur les expression régulières qui sont sur openclassroom qui sont vraiment très interessent.

https://www.openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/les-expressions-regulieres-partie-1-2
kinginventeur

kinginventeur Le 10 septembre 2016 à 22:15

Donc si je comprend bien j'utilise :
"#^[a-zA-Z0-9À-ú\.:\!\?\&',\s-]{10,140}#"

Ce code et sa autorise les a-z , A-Z , 0-9 , et les àéè et espace et sa interdit tout le reste ? Donc @ , < , > , / , \ , . , ! , etc... ? 😀
kinginventeur

kinginventeur Le 10 septembre 2016 à 22:16

Et la limite {10,140} sa sert a quoi s'il te plaît 😀 ?
TheFlameflo

TheFlameflo Le 10 septembre 2016 à 22:17

Salut !

Si tu veux tester des expressions régulières, je te conseille fortement le site regexr.com qui te permet de les tester en direct.
Bref, j'ima¸gine que dans un message tu vas accepter les points, les points d'exclamation, les virgules, etc.
J'ai donc créé ça :
/([a-zA-Z0-9!?.,:;çéàè ]+)/
Le seul problème qui peut arriver, c'est qu'un caractère ne soit pas pris en compte.
Alors, tu peux tester s'il n'y a pas certains caractères.

Si tu ne veux pas écrire tous les caractères qui existent pour les accepter, tu peux décider d'interdire ceux que tu ne veux pas :
/([^<>\\/@]+)/
Pour expliquer, le symbole '^' signifie que ça trouve tous les caractères qui ne sont pas dans l'expression régulière !

J'espère t'avoir aidé et n'hésite pas à changer ces expressions selon tes besoins ! 😀
TheOldNoob

TheOldNoob Le 10 septembre 2016 à 22:17

a limité le nombre de caractères, pour l'exemple que je t'es donné, c'est le regex que j'utilise lorsque je met un textarea, pour une description. La limite au minimum 10 et au maximum 140
kinginventeur

kinginventeur Le 10 septembre 2016 à 22:22

Oui mais TheHoldNoob j'ai essayer ton code et je peux faire " Ma réponse <?php ?> " et cela ne pose auccun probléme :(,

Et pour te répondre TheFlameflo , j'aimerai justement autoriser uniquement ce que je met dans preg_match , et rien d'autre. Ce n'est vraiment pas possible de faire ce genre de chose ?

Car généralement j'utilise ctype_alnum($mavariable) mais cela bloque tout sauf les numéro et lettre , et pour les réponse secréte c'est un peux embetant 😭

Merci de votre aide a tout les deux 😀 Esperant que je trouverai ma réponse car je n'arrive pas a la trouver même sur les forum 😭
TheOldNoob

TheOldNoob Le 10 septembre 2016 à 22:42 (Édité le 10 septembre 2016 à 22:45)

Je viens de corrigé ma ligne.
La différence, c'est que toi tu fait if(preg_match.... et que moi je fait if!preg_match.
J'utilise pas du tout le même genre de construction sur mes vérifiquation. Je te met un exemple de code pour vérifié mes formulaire.
C'est un code complet, avec le formulaire, pour l'ajout de date sur le site d'un musicien. Qui permetra aussi en cas d'erreur, de retenir ce qui a déjà été entré dans les champs.
J'utilise les booleen pour afficher/caché les messages d'erreur ou de réussite.

pour testé les failles xss, je t'invite a entré se code dans tout tes input/textarea :
<script > alert (Hack) </script >
Si une boite de dialogue avec le message (Hack) apparait, alors il y a faille. Sinon, je te laisse voir le résultat 😉
<?php
$post = array(); // Contiendra les données du formulaire nettoyées
$errors = array(); // contiendra nos éventuelles erreurs

$showErrors = false;
$success = false; 
$formShow = false;

$band = '';
$dateC = '';
$heureC = '';
$place = '';
$adress = '';
$city = '';
$tarif = '';


if (!empty($_POST)) {
    
    foreach ($_POST as $key => $value) { // Nettoyage des données
        $post[$key] = trim(strip_tags($value)); // récupération du _POST dans un tableau
    }
    
    if(!preg_match("#^[a-zA-Z0-9À-ú\.:\!\?\&',\s-]{3,25}#", $post['band'])){    
        $errors[] = 'Le groupe doit comporter entre 3 et 25 caractères';
    }
    if(!preg_match("#^[a-zA-Z0-9À-ú\.:\!\?\&',\s-]{3,25}#", $post['dateC'])){    
        $errors[] = 'La date doit comporter entre 3 et 25 caractères';
    }
    if(!preg_match("#^[a-zA-Z0-9À-ú\.:\!\?\&',\s-]{3,10}#", $post['heureC'])){    
        $errors[] = 'L\'heure du concert doit comporter entre 3 et 10 caractères';
    }
    if(!preg_match("#^[a-zA-Z0-9À-ú\.:\!\?\&',\s-]{3,25}#", $post['place'])){    
        $errors[] = 'Le lieu du concert doit comporter entre 3 et 25 caractères';
    }
    if(!preg_match("#^[a-zA-Z0-9À-ú\.:\!\?\&',\s-]{3,65}#", $post['adress'])){    
        $errors[] = 'L\'adresse du concert doit comporter entre 3 et 65 caractères';
    }
    if(!preg_match("#^[a-zA-Z0-9À-ú\.:\!\?\&',\s-]{3,30}#", $post['city'])){    
        $errors[] = 'La ville du concert doit comporter entre 3 et 30 caractères';
    }
    if(!preg_match("#^[a-zA-Z0-9À-ú\.:\!\?\&',\s-]{1,5}#", $post['tarif'])){    
        $errors[] = 'Le tarif doit comporter entre 1 et 5 caractères';
    }
    if(count($errors) > 0){  // On compte les erreurs, s'il y en a (supérieur a 0), on passera la variable $showErrors à true.
        $showErrors = true; // valeur booleen // permettra d'afficher nos erreurs s'il y en a.

        $band = $post['band'];
        $dateC = $post['dateC'];
        $heureC = $post['heureC'];
        $place = $post['place'];
        $adress = $post['adress'];
        $city = $post['city'];
        $tarif = $post['tarif'];
    }
    else { 
        // Insertion dans la pdo 
        $res = $pdo->prepare('INSERT INTO `date_concert` (`band`, `dateC`, `heureC`, `place`, `adress`, `city`, `tarif`) VALUES (:band, :dateC, :heureC, 😋lace, :adress, :city, :tarif)');

        $res->bindValue(':band',        $post['band'],    PDO::PARAM_STR);
        $res->bindValue(':dateC',       $post['dateC'],   PDO::PARAM_STR);
        $res->bindValue(':heureC',      $post['heureC'],  PDO::PARAM_STR);
        $res->bindValue(':place',       $post['place'],   PDO::PARAM_STR);
        $res->bindValue(':adress',      $post['adress'],  PDO::PARAM_STR);
        $res->bindValue(':city',        $post['city'],    PDO::PARAM_STR);
        $res->bindValue(':tarif',       $post['tarif'],   PDO::PARAM_INT);

        
    
        if($res->execute()){
            $success = true; // Pour afficher le message de réussite si tout est bon
            header('Location: view_accueil.php');
        }
        else {
            die;
        }
    }
}

?>

<div class="wrapper">
    <h1 class="text-center">Ajouter une date</h1>
    <br>
    <div class="container">

    <?php 
    if($success){ // On affiche la réussite si tout fonctionne
        echo '<div class="alert alert-success" role="alert"> Le concert a bien été créé ! </div>';
    }

    if($showErrors == true): ?>
        <div class="alert alert-danger" role="alert">
            <p style="color:red">Veuillez corriger les erreurs suivantes :</p>
                <ul style="color:red">
                <?php foreach($errors as $err): ?>
                    <li><?=$err;?></li>
                <?php endforeach;?>
                </ul>
        </div>
    <?php endif; ?>

        <div class="alert alert-info text-center" role="alert">Merci de remplir tous les champs correctement</div>  

            <form method="post" class="pure-form pure-form-aligned">

                <div class="form-group input-group">
                  <span class="input-group-addon" id="basic-addon1">Groupe</span>
                  <input type="text" class="form-control" name="band" placeholder="Nom du groupe" aria-describedby="basic-addon1" value="<?php if(isset($band)) {echo $band;} ?>">
                </div><br>
                <div class="form-group input-group">
                  <span class="input-group-addon" id="basic-addon1">Date</span>
                  <input type="text" class="form-control" name="dateC" placeholder="Date du concert" value="<?=$dateC;?>" aria-describedby="basic-addon1">
                </div><br>
                <div class="form-group input-group">
                  <span class="input-group-addon" id="basic-addon1">Heure</span>
                  <input type="text" class="form-control" name="heureC" placeholder="Heure du début du concert" value="<?= $heureC; ?>" aria-describedby="basic-addon1">
                </div><br>
                <div class="form-group input-group">
                  <span class="input-group-addon" id="basic-addon1">Lieu</span>
                  <input type="text" class="form-control" name="place" placeholder="Nom de la salle de concert" value="<?= $place; ?>" aria-describedby="basic-addon1">
                </div><br>
                <div class="form-group input-group">
                  <span class="input-group-addon" id="basic-addon1">Adresse</span>
                  <input type="text" class="form-control" name="adress" placeholder="Adresse du concert" value="<?= $adress; ?>" aria-describedby="basic-addon1">
                </div><br>
                <div class="form-group input-group">
                  <span class="input-group-addon" id="basic-addon1">Ville</span>
                  <input type="text" class="form-control" name="city" placeholder="Ville du concert" value="<?= $city; ?>" aria-describedby="basic-addon1">
                </div><br>
                <div class="form-group input-group">
                  <span class="input-group-addon" id="basic-addon1">Tarif</span>
                  <input type="text" class="form-control" name="tarif" placeholder="Veuillez indiquez le tarif en chiffre uniquement" value="<?= $tarif; ?>" aria-describedby="basic-addon1">
                </div><br>
                    <input type="submit" class="btn btn-success" value="Ajouter la date">
            </form> 
<?php var_dump($post); ?>


    </div>
</div>
kinginventeur

kinginventeur Le 10 septembre 2016 à 22:46

Pourquoi lorsque tu fais !preg_match sa compte uniquement l'erreur de la limite et non les caractéres ? Car en erreur tu met
if(!preg_match("#^[a-zA-Z0-9À-ú\.:\!\?\&',\s-]{3,25}#", $post['band'])){            
$errors[] = 'Le groupe doit comporter entre 3 et 25 caractères';    }
Mais pourquoi pas :
if(!preg_match("#^[a-zA-Z0-9À-ú\.:\!\?\&',\s-]{3,25}#", $post['band'])){            
$errors[] = 'Le groupe ne dois pas poceder de caractéres spéciaux.';    }
Je comprend vraiment pas ^^' Même en regardant les tuto du site du zéro , je trouve que c'est pas asser bien expliquer 😭
TheOldNoob

TheOldNoob Le 10 septembre 2016 à 22:57

Parce que mes caractères spéciaux vont être néttoyé juste avant.
J'ai pas besoin de dire a tout le monde ce qu'il ne doit pas faire. Mais lui indiquer ce qu'il doit faire en cas d'erreur uniquement.
kinginventeur

kinginventeur Le 10 septembre 2016 à 23:03

Je vais mettre le probléme comme résolu 😀 Merci de votre aide à tout les deux ^^
TheOldNoob

TheOldNoob Le 10 septembre 2016 à 23:06

De rien !
le site qu'a donné Flamflo est bien, n'hésite pas a t'en servir 😀
kinginventeur

kinginventeur Le 10 septembre 2016 à 23:26

Justement x) J'ai utiliser ce qu'il ma donner et sa fonctionne , la seul chose que je n'arrive pas a bloquer c'est les " () " ^^ Mais j'ai bloquer les ??????•?? , et les signes spéciaux ( la majoriter )
TheFlameflo

TheFlameflo Le 11 septembre 2016 à 00:34

Salut !

Le problème avec les "()", c'est que ça annonce un groupe dans la REGEX, du coup, faut les échapper en ajoutant "\" devant :
\(\)
TheOldNoob

TheOldNoob Le 11 septembre 2016 à 00:43

Il ne va plus resté grand chose a tapé dans ton formulaire ^^
kinginventeur

kinginventeur Le 11 septembre 2016 à 01:26

Ahahhaha ^^ Justement , je veux qu'ils puissent juste mettre une réponse simple et logique. Ce n'est pas une réponse de 100 caractéres mais bien de 3 à 25 maximum.

Et oui merci TheFlameflo de me le rappeler , car j'avais essayer mais sa me fesais une erreur ( logique .. Si je le met apres le # aahahahahahah ).

En tout cas un ENORME merci à vous deux , vous êtes vraiment sympa ! ^^
kinginventeur

kinginventeur Le 11 septembre 2016 à 01:28 (Édité le 11 septembre 2016 à 18:05)

Supprimer.
kinginventeur

kinginventeur Le 11 septembre 2016 à 18:06 (Édité le 11 septembre 2016 à 18:17)

J'ai trouver le code absolu qui me convient le mieux pour mon site ! , Si sa peux aider des gens voici le code ! 😀
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8"/>
</head>
<body>
<form method="POST">

    <select name="selection"> <!-- Les question secrétes que l'utilisateur chosis -->
        <option>Question secréte 1</option>
        <option>Question secréte 2</option>
        <option>Question secréte 3</option>
        <option>Question secréte 4</option>
    </select>

    </br>

    <input type="text" name="reponse"/> <!-- Sa réponse secréte qui est censer être proteger -->

    <input type="submit" value="Envoyer" name="envoyerform"/>

</form>
</body>

<?php // A NOTER: Je n'est pas mis la selection des question car ce code n'est qu'un test 😀

    if(isset($_POST['envoyerform'], $_POST['selection'], $_POST['reponse']))
    {
        $reponse = htmlspecialchars($_POST['reponse']);
        if(!empty($reponse))
        {    
            if(preg_match("#^[a-zA-Zàéè ]{1,20}[0-9]{0,}$#", $reponse))
            {
                if(strlen($reponse) > 2 AND strlen($reponse) < 21)
                {
                    if(preg_match("#\s$#", $reponse))
                    {
                        $reponsemod = substr($reponse, 0, -1);
                        echo 'Premiére reponse : <font color="purple">'.$reponse.'</font><font color="red">pas d\'espace mis </font>, deuxiéme réponse <font color="purple">'.$reponsemod.'</font><font color="red"> Espace ajouter.</font>';
                    }
                    else
                    {
                        echo '<font color="green">Votre réponse est correct : </font>'. $reponse;
                    }
                }
                else
                {
                    echo '<font color="red">Votre réponse dois avoir minimum 3 caractéres et max 20.</font>';
                }
            }
            else
            {
                echo '<font color="red">Réponse inccorrect , nous n\'acceptons pas les caractéres spéciaux !</font></br>';
            }
        }
        else
        {
            echo '<font color="red">Veuillez remplir le champ de votre réponse</font>';
        }
    }

?>

</html>
Derien 😋
TheOldNoob

TheOldNoob Le 11 septembre 2016 à 18:24

Content que tu est réussi.

Par contre, je pense que ça :
if(preg_match("#^[a-zA-Zàéè ]{1,20}[0-9]{0,}$#", $reponse))            {
                if(strlen($reponse) > 2 AND strlen($reponse) < 21)                {
ça reviens  a faire ça

if(preg_match("#^[a-zA-Zàéè ]{1,20}[0-9]{2,21}$#", $reponse))            {
              
kinginventeur

kinginventeur Le 11 septembre 2016 à 18:31

Oui mais avec moi on est jamais trop sécuriser ... XD IL faux MASSE sécuriter lol mais c'est vrai que j'aurais pu simplement mettre un $ ^^