Preg_match
- Accueil
- Forum
- Programmation
- PHP
- Preg_match
kinginventeur Le 10 septembre 2016 à 20:27 (Édité le 25 janvier 2019 à 17:52)
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 Le 10 septembre 2016 à 21:22 (Édité le 1 janvier 1970 à 01:00)
ç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 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 Le 10 septembre 2016 à 21:50 (Édité le 1 janvier 1970 à 01:00)
kinginventeur Le 10 septembre 2016 à 21:51 (Édité le 10 septembre 2016 à 21:51)
TheOldNoob Le 10 septembre 2016 à 22:12 (Édité le 10 septembre 2016 à 22:20)
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 Le 10 septembre 2016 à 22:15 (Édité le 1 janvier 1970 à 01:00)
"#^[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 Le 10 septembre 2016 à 22:16 (Édité le 1 janvier 1970 à 01:00)
TheFlameflo Le 10 septembre 2016 à 22:17 (Édité le 1 janvier 1970 à 01:00)
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 Le 10 septembre 2016 à 22:17 (Édité le 1 janvier 1970 à 01:00)
kinginventeur Le 10 septembre 2016 à 22:22 (Édité le 1 janvier 1970 à 01:00)
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 Le 10 septembre 2016 à 22:42 (Édité le 10 septembre 2016 à 22:45)
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 Le 10 septembre 2016 à 22:46 (Édité le 1 janvier 1970 à 01:00)
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 Le 10 septembre 2016 à 22:57 (Édité le 1 janvier 1970 à 01:00)
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 Le 10 septembre 2016 à 23:03 (Édité le 1 janvier 1970 à 01:00)
TheOldNoob Le 10 septembre 2016 à 23:06 (Édité le 1 janvier 1970 à 01:00)
le site qu'a donné Flamflo est bien, n'hésite pas a t'en servir 😀
kinginventeur Le 10 septembre 2016 à 23:26 (Édité le 1 janvier 1970 à 01:00)
TheFlameflo Le 11 septembre 2016 à 00:34 (Édité le 1 janvier 1970 à 01:00)
Le problème avec les "()", c'est que ça annonce un groupe dans la REGEX, du coup, faut les échapper en ajoutant "\" devant :
\(\)
TheOldNoob Le 11 septembre 2016 à 00:43 (Édité le 1 janvier 1970 à 01:00)
kinginventeur Le 11 septembre 2016 à 01:26 (Édité le 1 janvier 1970 à 01:00)
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 Le 11 septembre 2016 à 18:06 (Édité le 11 septembre 2016 à 18:17)
<!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 Le 11 septembre 2016 à 18:24 (Édité le 1 janvier 1970 à 01:00)
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 Le 11 septembre 2016 à 18:31 (Édité le 1 janvier 1970 à 01:00)