Discussion:
Filtre d'adresse courriel
(trop ancien pour répondre)
Pascale
2007-11-29 00:57:44 UTC
Permalink
Oui oui oui, je connais l'adresse de la FAQ (:
Je m'étonne juste d'un truc. J'ai un filtre fait comme ceci :

[...]
if (!ereg("([A-Za-z0-9]|-|_|\.)*@([A-Za-z0-9]|-|_|\.)*\.([A-Za-z0-9]|-
|_|\.)*",$courriel))
{$err='1';
echo '<p class="erreur">'.$courriel.' n\'est pas une adresse courriel
valide</p>';
$courriel="";}

Ce qui m'étonne, c'est que ce filtre laisse passer sans moufter une adresse
comprenant par exemple un é. C'est-y normal ? Comment filtrer les accents ?
--
Pascale
Olivier Miakinen
2007-11-29 10:28:37 UTC
Permalink
Post by Pascale
[...]
|_|\.)*",$courriel))
Beurk. :-(


Déjà, en continuant à utiliser ereg au lieu de preg et sans changer la
syntaxe de ce qu'il accepte, c'est équivalent à l'écriture plus simple
suivante :

if (!ereg("[A-Za-z0-9_.-]*@[A-Za-z0-9_.-]*\.[A-Za-z0-9_.-]*",$courriel))


Et en fait, comme il manque l'ancrage au début (^) et à la fin ($),
Post by Pascale
Ce qui m'étonne, c'est que ce filtre laisse passer sans moufter une adresse
comprenant par exemple un é. C'est-y normal ?
Oui, c'est normal. Tu demandes juste qu'il y ait quelque part dans la
chaîne un « @ » et un « . » en contrôlant ce qui se trouve entre les
deux, mais tu ne contrôles rien de ce qu'il y a avant ou après.
Post by Pascale
Comment filtrer les accents ?
En faisant un filtre qui contrôle *toute* la chaîne et pas seulement une
partie. Mais ceux de la FAQ sont quand même meilleurs.
Pascale
2007-11-29 14:12:55 UTC
Permalink
Post by Olivier Miakinen
Beurk. :-(
Ben pourquoi ? En plus, vu mon niveau de connaissance des expressions
Post by Olivier Miakinen
Déjà, en continuant à utiliser ereg au lieu de preg et sans changer la
syntaxe de ce qu'il accepte, c'est équivalent à l'écriture plus simple
C'est mieux d'utiliser preg ? Pourquoi ?...
Post by Olivier Miakinen
if
Et en fait, comme il manque l'ancrage au début (^) et à la fin ($),
Oui, c'est normal. Tu demandes juste qu'il y ait quelque part dans la
deux, mais tu ne contrôles rien de ce qu'il y a avant ou après.
Pourquoi ? Le test est le même avant et après l'@, pourquoi les accents
passeraient-ils sur la partie qui précède le @ et seulement là ?
J'avoue que je ne comprends pas du tout...
Pour moi, l'ereg de départ vérifie que l'on a : un ou plusieurs caractères
alpha-numériques (plus quelques autres autorisés), un @, un ou plusieurs
caractères alpha-numériques (et quelques autres), un point et enfin un ou
plusieurs caractères alphanumériques.
Un é, ce n'est pas compris entre a et z, ni entre A et Z ni entre 0 et 9,
donc ???
Post by Olivier Miakinen
En faisant un filtre qui contrôle *toute* la chaîne et pas seulement
une partie. Mais ceux de la FAQ sont quand même meilleurs.
C'est vraiment ce que je pensais faire. Pourquoi seul l'@ serait-il pris en
compte dans le test que je fais ?
--
Pascale
Olivier Miakinen
2007-11-29 14:36:53 UTC
Permalink
Bonjour,
Post by Pascale
Post by Olivier Miakinen
Beurk. :-(
Ben pourquoi ?
Pour plusieurs raisons, dont certaines que j'ai déjà expliquées, par
exemple la syntaxe compliquée ([A-Za-z0-9]|-|_|\.)* au lieu d'écrire
tout simplement [A-Za-z0-9_.-]* mais aussi le fait que le « + » n'est
pas prévu, et donc mon adresse serait refusée si l'auteur de cette
expression n'avait pas oublié d'« ancrer » le test : « ^...$ ».
Tiens, une gauchère ! (^_^)
Post by Pascale
Post by Olivier Miakinen
Déjà, en continuant à utiliser ereg au lieu de preg et sans changer la
syntaxe de ce qu'il accepte, c'est équivalent à l'écriture plus simple
C'est mieux d'utiliser preg ? Pourquoi ?...
Parce qu'elles sont plus puissantes, et en général plus rapides.

<http://fr2.php.net/manual/fr/function.ereg.php>
Note: preg_match(), qui utilise la syntaxe des expressions rationnelles
compatibles PERL, est une alternative plus rapide de ereg().
</>
Post by Pascale
Post by Olivier Miakinen
[...]
Le test avant l'@ et après le . sont optionnels. S'il existe un é par
là, alors la chaîne reconnue commencera *après* le é.
Post by Pascale
J'avoue que je ne comprends pas du tout...
Pour moi, l'ereg de départ vérifie que l'on a : un ou plusieurs caractères
alpha-numériques (plus quelques autres autorisés),
Non pas « un ou plusieurs » mais « zéro, un ou plusieurs ». C'est le +
qui signifie « un ou plusieurs ».
Post by Pascale
caractères alpha-numériques (et quelques autres), un point et enfin un ou
plusieurs caractères alphanumériques.
Un é, ce n'est pas compris entre a et z, ni entre A et Z ni entre 0 et 9,
donc ???
Je prends quelques exemples, ce sera plus simple pour expliquer.

Regexp = x*@x*
chaîne testée ***@xxx : succès, résultat = ***@xxx
chaîne testée éé***@xéé : succès, résultat = ***@x
chaîne testée ééé@ééé : succès, résultat = @
chaîne testée ééééééé : échec

Regexp = ^x*@x*$
chaîne testée ***@xxx : succès, résultat = ***@xxx
chaîne testée éé***@xéé : échec
chaîne testée ééé@ééé : échec
chaîne testée ééééééé : échec
Post by Pascale
Post by Olivier Miakinen
En faisant un filtre qui contrôle *toute* la chaîne et pas seulement
une partie. Mais ceux de la FAQ sont quand même meilleurs.
compte dans le test que je fais ?
Il manquait les méta-caractères ^(ancre sur le début de la chaîne) et $
(ancre sur la fin de la chaîne).
Pascale
2007-11-29 19:00:38 UTC
Permalink
Post by Olivier Miakinen
Pour plusieurs raisons, dont certaines que j'ai déjà expliquées, par
exemple la syntaxe compliquée ([A-Za-z0-9]|-|_|\.)* au lieu d'écrire
tout simplement [A-Za-z0-9_.-]* mais aussi le fait que le « + » n'est
pas prévu, et donc mon adresse serait refusée si l'auteur de cette
expression n'avait pas oublié d'« ancrer » le test : « ^...$ ».
Vu.
Post by Olivier Miakinen
Tiens, une gauchère ! (^_^)
Yep (o;
Post by Olivier Miakinen
Parce qu'elles sont plus puissantes, et en général plus rapides.
<http://fr2.php.net/manual/fr/function.ereg.php>
Note: preg_match(), qui utilise la syntaxe des expressions
rationnelles compatibles PERL, est une alternative plus rapide de
ereg(). </>
Bon bon bon, je vois qu'il faut que je me replonge dans le manuel...
Post by Olivier Miakinen
là, alors la chaîne reconnue commencera *après* le é.
Non pas « un ou plusieurs » mais « zéro, un ou plusieurs ». C'est le +
qui signifie « un ou plusieurs ».
Oui, c'est vrai.
Post by Olivier Miakinen
Je prends quelques exemples, ce sera plus simple pour expliquer.
[couic]
Il manquait les méta-caractères ^(ancre sur le début de la chaîne) et
$ (ancre sur la fin de la chaîne).
Et le pire, c'est que ça faisait partie des quelques trucs que j'avais
pigés en matière de regexp... Et ben, ça m'apprendra à faire les
poubelles...

Merci de ta patience !
--
Pascale
Denis Beauregard
2007-11-29 17:22:59 UTC
Permalink
Post by Pascale
[...]
|_|\.)*",$courriel))
{$err='1';
echo '<p class="erreur">'.$courriel.' n\'est pas une adresse courriel
valide</p>';
$courriel="";}
Ce qui m'étonne, c'est que ce filtre laisse passer sans moufter une adresse
comprenant par exemple un é. C'est-y normal ? Comment filtrer les accents ?
Les noms de domaine avec accents sont ou seront possibles. Il y a
déjà quelque chose prévu pour l'alphabet chinois, il me semble.

Ceci dit, je traite le problème de cette façon:

explode avec @, doit donner 2 éléments, sinon rejet
validation du 2e élément ($dom):
explode avec . et 2 éléments ou plus
doit avoir une IP équivalente (sinon, le nom de domaine est
invalide)

// $cour= courriel recu
$er = 0;
$cour2=explode("@", $cour);
if (count ($cour2) != 2) $er = 1;
if (count ($cour2) == 2) {
$dom=$cour2[1];
$cour3=explode(".", $dom);
if (count ($cour3) < 2) $er = 1;
if (count ($cour3) >= 2) {
$ip = gethostbyname($dom);
if ($ip == $dom) { $er = 1; };
};

Le code n'est pas optimisé (pas de clauses else), mais c'est peu
utilisé et comme j'ai développé un gros morceau de code rapidement
je n'ai pas voulu me mélanger dans les accolades.


Denis
Pascale
2007-11-29 19:00:38 UTC
Permalink
Post by Denis Beauregard
Les noms de domaine avec accents sont ou seront possibles. Il y a
déjà quelque chose prévu pour l'alphabet chinois, il me semble.
[couic]
Le code n'est pas optimisé (pas de clauses else), mais c'est peu
utilisé et comme j'ai développé un gros morceau de code rapidement
je n'ai pas voulu me mélanger dans les accolades.
Oups... c'est bien compliqué pour mon neurone... Je m'en tiens pour
l'instant à la solution de la FAQ, du moins, tant qu'il n'y a pas d'accents
dans les noms de domaine...
--
Pascale
Mickael Wolff
2007-12-01 21:03:22 UTC
Permalink
Post by Pascale
Oups... c'est bien compliqué pour mon neurone... Je m'en tiens pour
l'instant à la solution de la FAQ, du moins, tant qu'il n'y a pas d'accents
dans les noms de domaine...
Les accents sont utilisables depuis longtemps. Mais vu que chez MS ils
ne sont pas capable de faire un navigateur respectant les normes, ben ça
ne c'est pas développé. Si tu tappes à.com dans Firefox, tu verras à
quoi ressemble une URL encodée pour supporter les accents (il est à
noter que c'est le codage qui est affiché, et non pas à .com, car de
telles URL furent utilisées pour du phishing).


Pour tester les regexp, j'utilises l'outil suivant :
<http://laurent.riesterer.free.fr/regexp/>. Il est certes laid (Tcl/Tk),
mais très pratique.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Pascale
2007-12-02 15:52:26 UTC
Permalink
Post by Mickael Wolff
Les accents sont utilisables depuis longtemps. Mais vu que chez MS ils
ne sont pas capable de faire un navigateur respectant les normes, ben
ça ne c'est pas développé. Si tu tappes à.com dans Firefox, tu verras
à quoi ressemble une URL encodée pour supporter les accents (il est à
noter que c'est le codage qui est affiché, et non pas à .com, car de
telles URL furent utilisées pour du phishing).
Firefox le traduit par http://xn--0ca.com/. Opera ne le traduit pas mais
amène le même résultat. Exploser fait pareil.
Donc Firefox est le seul à savoir se débrouiller ?
Post by Mickael Wolff
<http://laurent.riesterer.free.fr/regexp/>. Il est certes laid
(Tcl/Tk), mais très pratique.
Et zou, en marque-page. Merci ! (:
--
Pascale
Olivier Miakinen
2007-12-02 21:22:45 UTC
Permalink
Post by Pascale
[ noms de domaines avec accents ]
Firefox le traduit par http://xn--0ca.com/.
Exactement. Je n'avais pas pris la peine de répondre à Denis, mais tu
vois qu'il n'est donc pas nécessaire de modifier les regexps pour
prendre en compte les accents puisque le *vrai* nom, celui qui est
transmis, respecte déjà la vieille syntaxe.
Post by Pascale
Opera ne le traduit pas mais
amène le même résultat. Exploser fait pareil.
Donc Firefox est le seul à savoir se débrouiller ?
S'ils amènent le même résultat, c'est qu'ils traduisent exactement comme
Firefox. Simplement Firefox est le seul à afficher le nom réel. Lorsque
ces noms de domaine se généraliseront, je pense que les navigateurs
permettront d'afficher les deux.
Pascale
2007-12-03 10:21:14 UTC
Permalink
Post by Olivier Miakinen
Exactement. Je n'avais pas pris la peine de répondre à Denis, mais tu
vois qu'il n'est donc pas nécessaire de modifier les regexps pour
prendre en compte les accents puisque le *vrai* nom, celui qui est
transmis, respecte déjà la vieille syntaxe.
Donc ça roule !
Post by Olivier Miakinen
S'ils amènent le même résultat, c'est qu'ils traduisent exactement comme
Firefox. Simplement Firefox est le seul à afficher le nom réel. Lorsque
ces noms de domaine se généraliseront, je pense que les navigateurs
permettront d'afficher les deux.
Ce serait logique, en effet.
--
Pascale
Continuer la lecture sur narkive:
Loading...