Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/07/2007, 09h42   #1
Invité de passage
 
Étudiant
Inscription : juin 2007
Messages : 8
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2007
Messages : 8
Points : 0
Points : 0
Par défaut Autoriser les caractères spéciaux

Bonjour, j'utilise le forum car j'ai malheureusement des difficultés et donc j'en viens à demander votre aide.

J'ai réalisé un formulaire de devis qui utilise donc des REGEX pour traiter les différents champs. Cependant j'ai fait quelques recherches mais il m'a tjs été impossible de réussir à modifier le code pour que ça marche (j'ai tenté pour le champs nom d'autoriser les ponctuations et les lettres avec accents mais sans réussite).

En gros j'aurais aimé autoriser les accents et les ponctuations (telles que la virgule, l'apostrophe, le point) pour les champs ci-dessous et pour le champs commentaire qui se situe sur une autre page de devis (mon formulaire est en plusieurs étapes).
J'ai lu que le souci pour autoriser ses caractères provenaient d'un "conflit" avec le htmlentities mais je ne sais pas par quoi, ni comment le remplacer.

Pourriez-vous me donner un exemple pour le champs nom svp ? histoire que je comprenne comment modifier parce que je n'y suis pas parvenu.

Ci-dessous le code :

Code :
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
<?php
//champ nom
$_SESSION["nom"] = $_POST["nom"];
 
//si le champs est rempli
if (!empty($_SESSION["nom"]))
{
//on teste que la valeur soit correcte
$_SESSION["nom"] = addslashes(trim(htmlentities($nom, ENT_QUOTES)));
 
$verif="!^[a-zA-Z ]{2,40}$!";
$search = 'çñÄÂÀÁäâàáËÊÈÉéèëêÏÎÌÍïîìíÖÔÒÓöôòóÜÛÙÚüûùúµ';
$replace = 'cnaaaaaaaeeeeeeeeeiiiiiiiioooooooouuuuuuuuu';
$_SESSION["nom"] = html_entity_decode($_SESSION["nom"]);
$_SESSION["nom"] = strtr($_SESSION["nom"], $search, $replace);
if(!preg_match($verif, $_SESSION["nom"]))
{
//si le champs n'obeit pas au REGEX, on alerte
		echo "le nom que vous avez saisi contient des erreurs";
		exit;
}
}
else 
{
//si le champs est vide, on alerte
		echo "Vous n'avez pas saisi votre nom";
		exit;
}
 
//champ prénom
$_SESSION["prenom"] = $_POST["prenom"];
 
//si le champs est rempli
if (!empty($_SESSION["prenom"]))
{
//on teste que la valeur soit correcte
$_SESSION["prenom"] = addslashes(trim(htmlentities($prenom, ENT_QUOTES)));
 
$verif="!^[a-zA-Z ]{2,40}$!";
if(!preg_match($verif, $_SESSION["prenom"]))
{
//si le champs n'obeit pas au REGEX, on alerte
        echo "Le prenom que vous avez saisi contient des caracteres qui ne sont pas autorises (attention les accents sont interdits)";
		exit;
}
}
else 
{
//si le champs est vide, on alerte
		echo "Vous n'avez pas saisi votre prenom";
		exit;
}
 
//champ adresse
$_SESSION["adresse"] = $_POST["adresse"];
 
//si le champs est rempli
if (!empty($_SESSION["adresse"]))
{
//on teste que la valeur soit correcte
$_SESSION["adresse"] = addslashes(htmlentities($adresse, ENT_QUOTES));
 
$verif="!^[a-zA-Z 0-9-\./ ]{5,50}$!";
if(!preg_match($verif, $_SESSION["adresse"]))
{
//si le champs n'obeit pas au REGEX, on alerte
        echo "l'adresse que vous avez saisie n'est pas valide (attention l'adresse doit etre composee de 5 caracteres au minimum) !";
		exit;
}
}
else 
{
//si le champs est vide, on alerte
		echo "Vous n'avez pas saisi votre adresse";
		exit;
}
 
 
//champ ville
$_SESSION["ville"] = $_POST["ville"];
 
//si le champs est rempli
if (!empty($_SESSION["ville"]))
{
//on teste qu'il soit correctement rempli
$_SESSION["ville"] = addslashes(trim(htmlentities($ville, ENT_QUOTES)));
 
$verif="!^[a-zA-Z-\./ ]{2,50}$!";
if(!preg_match($verif, $_SESSION["ville"]))
{
//si le champs n'obeit pas au REGEX, on alerte
        echo "La ville que vous avez saisie est incorrecte (attention les accents sont interdits) !";
		exit;
}
}
else 
{
//si le champs est vide, on alerte
		echo "Vous n'avez pas saisi votre ville";
		exit;
}
 
//champ département
$_SESSION["departement"] = $_POST["departement"];
 
//si le champs est rempli
if (!empty($_SESSION["departement"]))
{
//on teste qu'il soit correctement rempli
$_SESSION["departement"] = addslashes(trim(htmlentities($departement, ENT_QUOTES)));
 
$verif="!^[0-9]{2,5}$!";
if(!preg_match($verif, $_SESSION["departement"]))
{
//si le champs n'obeit pas au REGEX, on alerte
        echo "Le numero de departement que vous avez saisi n'est pas valide ";
		exit;
}
}
else 
{
//si le champs est vide, on alerte
		echo "Vous n'avez pas saisi votre numero de departement";
		exit;
}
 
//champ email
$_SESSION["email"] = $_POST["email"];
 
//si le champs est rempli
if (!empty($_SESSION["email"])) 
{
//on teste qu'il soit correctement rempli
$_SESSION["email"] = addslashes(trim(htmlentities($email, ENT_QUOTES)));
 
$verif="!^[a-zA-Z0-9\._\-]+@[a-zA-Z0-9\._\-]{2,}\.[a-zA-Z]{2,4}$!";
if(!preg_match($verif, $_SESSION["email"]))
{
//si le champs n'obeit pas au REGEX, on alerte
        echo "Votre email n'est pas valide !";
		exit;
}
}
else 
{
//si le champs est vide, on alerte
	echo "Vous n'avez pas saisi votre email";
	exit;
}
 
//champ téléphone
$_SESSION["tel"] = $_POST["tel"];
 
//si le champs est rempli
if (!empty($_SESSION["tel"]))
{
//on teste qu'il soit correctement rempli
$_SESSION["tel"] = addslashes(trim(htmlentities($tel, ENT_QUOTES)));
 
$verif="!^[0]{1}[0-9]{9}$!";
if(!preg_match($verif, $_SESSION["tel"]))
{
//si le champs n'obeit pas au REGEX, on alerte
        echo "Le numero de telephone que vous avez saisi n'est pas valide !";
		exit;
}
}
else
{
//si le champs est vide, on alerte
	echo "Vous n'avez pas saisi votre numero de telephone";
	exit;
}
 
//champs commentaires
$_SESSION["commentaires"] = $_POST["commentaires"];
 
//si le champs est rempli
if(!empty($_SESSION["commentaires"]))
{
	$_SESSION["commentaires"] = addslashes(htmlentities($commentaires, ENT_QUOTES));
 
$verif="!^[a-zA-Z 0-9 \./]{1,200}$!";
if(!preg_match($verif, $_SESSION["commentaires"]))
{
//si c'est pas alpha-numerique on alerte
        echo "Le commentaire que vous avez saisi est incorrect";
		exit;
}
}
?>
Merci par avance
draedalus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 10h01   #2
Invité de passage
 
Étudiant
Inscription : juin 2007
Messages : 8
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2007
Messages : 8
Points : 0
Points : 0
Alors je viens d'essayer un bout de code et j'arrive à autoriser les accents pour le nom MAIS le résultat à l'envoi du mail est catastrophique !!!

Ci-dessous le code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
//si le champs est rempli
if (!empty($_SESSION["nom"]))
{
//on teste que la valeur soit correcte
$_SESSION["nom"] = addslashes(trim($nom, ENT_QUOTES));
 
if(eregi("^[a-zA-Z_&; ]{2,}[a-zA-Z_&; ]$", $_SESSION["nom"]))
{
//si le champs n'obeit pas au REGEX, on alerte
		echo "le nom que vous avez saisi contient des erreurs";
		exit;
}
Est-ce que le code garde une sécurité suffisante vu que je n'utilise plus le htmlentities ?

J'ai testé en envoyant le nom écoupé et dans le récapitulatif l'ortographe est correcte mais cependant l'orthographe dans le mail est déformé, j'obtiens quelque chose du genre :
Demande de devis provenant de M./Mlle/Mme : écoupé
et ensuite dans le nom j'obtiens :
nom : C)coupC

Comment puis-je faire en sorte que l'ortographe ne soit pas déformée ? Merci.
draedalus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 10h53   #3
Invité de passage
 
Étudiant
Inscription : juin 2007
Messages : 8
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2007
Messages : 8
Points : 0
Points : 0
Des nouvelles, j'essaye d'utiliser la fonction str_replace mais je n'arrive pas à remplacer les chaines de caracteres saisies, pourrais-je avoir des informations si possible ?

Code :
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
//si le champs est rempli
if (!empty($_SESSION["nom"]))
{
//on teste que la valeur soit correcte
$_SESSION["nom"] = addslashes(trim($nom, ENT_QUOTES));
 
/*$verif="!^[a-zA-Z_&; ]{2,40}[a-zA-Z_&; ]$!";*/
/*$search = 'çñÄÂÀÁäâàáËÊÈÉéèëêÏÎÌÍïîìíÖÔÒÓöôòóÜÛÙÚüûùúµ';*/
$search = array("ç","ñ","Ä","Â","À","Á","ä","â","à","á","Ë","Ê","È","É","é","è","ë","ê","Ï","Î",",","Ì","Í","ï","î","ì","í","Ö","Ô","Ò","Ó","ö","ô","ò","ó","Ü","Û","Ù","Ú","ü","û","ù","ú","µ");
$replace = array("c","n","a","e","i","o","u");
$_SESSION["nom"] = str_replace($search, $replace, $_SESSION["nom"]);
 
/*$_SESSION["nom"] = strtr($_SESSION["nom"], $search, $replace);
if(!preg_match($verif, $_SESSION["nom"]))*/
 
if(eregi("!^[a-zA-Z ]{2,40}$!", $_SESSION["nom"]))
{
//si le champs n'obeit pas au REGEX, on alerte
		echo "le nom que vous avez saisi contient des erreurs";
		exit;
}
}
else 
{
//si le champs est vide, on alerte
		echo "Vous n'avez pas saisi votre nom";
		exit;
}
draedalus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2007, 17h50   #4
Invité de passage
 
Inscription : mars 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 2
Points : 2
Points : 2
Bonjour,

Citation de la doc PHP sur la fonction str_replace() :

Citation:
Si search et replace sont des tableaux, alors str_replace() prendra une valeur de chaque tableau, et l'utilisera pour faire le remplacement dans subject. Si replace a moins de valeurs que search, alors une chaîne vide sera utilisée pour effectuer les remplacements. Si search est un tableau et que replace est une chaîne, alors la chaîne de remplacement sera utilisée pour chaque élément de search. Cependant, l'inverse n'aurait aucun sens.
Donc dans ton tableau, il faut que tu aies autant de valeur de remplacement que de valeurs à remplacer.

En version simplifiée, je dirais que ça donnerai un truc dans le genre :

Code :
1
2
3
4
5
6
7
8
 
<?php
$nom = "hélène mälâstre"; //Toute ressemblance avec un nom existant serait fortuite;
 
$nom = str_replace(array('é', 'è', 'ä', 'â'), array('e', 'e', 'a', 'a'), $nom);
 
echo $nom;
?>
Cela donne :

helene malastre

Il faut autant de 'e' dans le tableau de remplacement que de 'é', 'è', 'ê' etc.. dans le tableau des éléments à remplacer. Effectivement, PHP ne fait pas la correspondance (pas encore du moins ).

A+

Doug
slybear est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2007, 18h54   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par draedalus
J'ai réalisé un formulaire de devis qui utilise donc des REGEX pour traiter les différents champs. Cependant j'ai fait quelques recherches mais il m'a tjs été impossible de réussir à modifier le code pour que ça marche (j'ai tenté pour le champs nom d'autoriser les ponctuations et les lettres avec accents mais sans réussite).
Cette expression (extension PCRE) serait simplement : ~^[[:alnum:][:punct:]]+$~D

Ce test en revanche est faux :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
if(!preg_match($verif, $_SESSION["nom"]))
{
//si le champs n'obeit pas au REGEX, on alerte
		echo "le nom que vous avez saisi contient des erreurs";
		exit;
}
}
else 
{
//si le champs est vide, on alerte
		echo "Vous n'avez pas saisi votre nom";
		exit;
}
Le cas du champ vide non seulement est déjà traité par la condition : if (!empty($_SESSION["nom"])) mais la partie else de la condition ci-dessus indique qu'il y aura correspondance avec le motif. Le cas du champ vide correspondra, elle aussi, à la partie if.

Il est inutile d'encoder pour décoder, strtr convient parfaitement pour transformer les caractères accentués en leur forme sans accent et je doute que trim apprécie ENT_QUOTES comme valeur pour son deuxième paramètre.

En ce qui concerne :
Citation:
Demande de devis provenant de M./Mlle/Mme : écoupé
Vous avez un problème d'encodage (UTF-8) quelque part le tout est de trouver où pour faire le nécessaire.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h37.


 
 
 
 
Partenaires

Hébergement Web