Tester la présence d'un arobase dans un formulaire PHP

Bonjour les loupioutes.
Pour un exercice de PHP, je dois tester la présence de l’arobase d’une adresse email.

Pour l’instant, j’ai fais le code suivant :

[b]<?php

// Récupération des variables du formulaire

$name = $_POST[“name”];
$email = $_POST[“email”];
$web = $_POST[“web”];
$message = $_POST[“message”];
$erreur="";

// Controle des champs du formulaire si faux

if (empty($name)) {$erreur .=“La saisie du nom est obligatoire”;}
if (empty($email)) {$erreur .=“La saisie de l’email est obligatoire”;}
if (empty($web)) {$erreur .=“La saisie du site web est obligatoire”;}
if (empty($message)) {$erreur .=“La saisie du message est obligatoire”;}

// Si la variable Erreur est vide, afficher les valeurs remplis du formulaire. Si variable Erreur est rempli, afficher la variable.

if (empty($erreur)) { Echo “votre nom est $name
votre email est $email
votre site web est $web
votre message est $message”;} else {Echo “$erreur”;}
?>[/b]

Je souhaiterais ajouter un test pour vérifier que l’arobase soit présent dans l’émail.
Sur le web, il y a moulte solutions, mais aucune ne me parait vraiment adapté à ce que je cherche à faire précisément.
Avez vous une idée ?

Merci et bonne journée :wink:
Edité le 10/11/2009 à 10:47

Il te suffi de parcourir la chaine de caractère avec une boucle et d’essayé à chaque fois de voir s’il y a un @.
Ou encore mieux, tu emploie le regexp (regular expression).
Ici un petit tuto en français : www.commentcamarche.net…

Merci beaucoup, je me suis inspiré de la méthode et ça marche.
Au plaisir.

Sinon fait mumuse avec les filtres PHP : fr2.php.net…

fr2.php.net…
fr2.php.net…

Le mieu reste a mon avis l’utilisation d’une REGEX (expression régulière)
avec la méthode eregi() en php (il y en a une autre mais je ne connais pas son nom)
Pour savoir comment écrire une REGEX tu as plein de site qui peuvent de montrer .
En voici un autre : chizembert.free.fr…

PS : ce site est encore en construction

cf. le lien que j’ai fournis. Y a déjà des trucs en PHP, autant s’en servir.

salut
pour ma par je suis de lavis de Akkai j’utilise un regex qui permet de verifier l’envoie general de l’adresse mail
puis tu compar ton regex avec l’envoie poster par l’utilisateur avec la fonction ereg()

rappelle de la structure type d’une adrees mail
sa commence obligatoirement par un letre
ensuite il y a autant de charactere voulut du moment qu’il sont alpha numerique
ensuite ont retrouver soit un point soit -
ensuite encore une fois autant de charactere voulut du moment qu’il sont alpha numerique
ensuite le @
suivie du nom de nom qui a un minimum de 2 caracter
suivi du .
puis de l’extension(com , fr ,org , ect…)qui est compris entre 2 et 4 caractere minimum

  $regex = "(^[a-z]) ([a-z0-9])+ (\.|-)? ([a-z0-9]+) @ ([a-z0-9]{2,}) \. ([a-z]{2,4]$)"; 
          if(ereg($regex,$email)
         {
             ADRESE mail vlide 
         }
         else { ADRESSE non VALIDE ;}

petite explication :
la variable $regex va permetre de verifier la sintax global de l’adreese mail poster par l’utilisateur
$regex est de type string donc sa commence par " et termine par " ;
le signe ^ indique le debut de la chaine
donc
(^[a-z]) indique le premier caraceter doit obligatoirement etre compris entre a et z uniquement

([a-z0-9])+ indique que la deuxieme letre peut etre de type alphanumerique ( entre a et z ou 0 et 9 ) le signe+ indique que lcaracter peut etre repeter entre une et plusieur fois

(.|-)? le \ permet d’echaper le . et le ? permet de donner une notion falcultative autrement dis le caracter suivant peut etre soit un point soit - ou aucun des deux

([a-z0-9])+ encor une fois est identique a celui citer plus haurt

le signe @ indique le caracter suivant est obligatoirement @

([a-z0-9]{2,}) encore un le caracter suivant est compris de a a z ou de 0 a 9 ce qui chanche ce coup ci c’est {2,} cela signifi que ceci doit etre repetreer au moin deux fois par exemple (ab = valide) (5g=valide) (54kj = valide) (h = non valide)

ensuite on retrouve le . avec \ .

([a-z]{2,4]$ ceci indique que le dernier segment est de type a a z repeter entre 2 fois et 4 fois par exemple (com =valide)(fr=valide)
(frfrfr = non valide)

tu verifie enfin le tout avec ereg(COMPARANT , COMPARER) qui est un booleen
voila j’espere que sa t’aura pas mal aidé avec ce type de regex tu verifie la totaliter de ladresse donner sa t’eviteras de retouver des adreese du type (toto@.com ou dujnou@mail.klmjfrd ou encor plein de chose alucinent qui sont des adrees mail non valide)
a bientot will

Je n’arrive toujours pas à saisir pourquoi vous vous entêter à utiliser des regexp quand dans les fonctions de base de PHP5 dont fait partie ereg, il y a déjà une fonction qui fait déjà tout ce que vous voulez ?

$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL)

if ($email === null) {
  echo 'email vide, invalide, rien nada', "<br>";
} elseif ($email === false) {
  echo 'email invalide (pas au bon format, voir RFC ad hoc)', "<br>";
} else {
  echo 'email ', $email, ' valide', "<br>";
}

Surtout que dire que les emails n’acceptent que les lettres alphanumériques, c’est de la connerie. Quand un chinois s’inscrira sur votre site depuis foobar@??.com, il ne pourra pas !

Les noms de domaine qui acceptent l’utf-8 c’est maintenant.

[edit] et si on me dit “oui mais c’est un exo, faut le faire soi-même”, encore faut-il voir la demande. Si c’est filtrer les emails invalides, c’est niquel; si c’est interdire des emails parce qu’on aime pas leur gueule, ben optez pour la solution ereg (berk) ou preg_match (mieux).

Mais même encore, si c’est pour juste tester la présence du @ (comme demandé), autant faire un substr_count($email, ‘@’) et vérifier que ça retourne bien exactement 1 !
Edité le 01/12/2009 à 20:43

Tout à fait juste (cependant, j’aurais opté pour strpos() ;)).

T’exagères un peu, ca n’existe que depuis quelques mois, et encore pas tous les fournisseurs.

Sinon, dans le cadre d’un exercice, faudrait simplement demander au prof si :

  • les noms de domaines longs sont considérés (> 255 caractères)
  • les noms de domaines internationalisés (dixit Sans nom) sont considérés
  • les adresses IP sont considérées

Pour le dernier point, le pattern fourni valide toto@123.456.789.12 toto@123.254.254.12 mais également toto@123.456.789 ce qui est une erreur.

EDIT : Bien vu Sans Nom :smiley:
Edité le 02/12/2009 à 11:39

Autant le faire tout de suite plutôt que devoir revenir sur le code plus tard…

ok autant pour moi …
j ai apris avec les regex mais je doit avouer que ta solution permet de courir moin de risque en se trompant dans le regex .
j’opterais pour ta solution maintenant … merci

mais la meilleur solution reste tout de meme de le verifier avant l’envoie en javascript.:):):slight_smile:

Non. La meilleure solution c’est toujours de valider côté serveur. Javascript c’est qu’une surcouche, et ça ne doit pas remplacer les tests serveur.

toto@123.456.789.12 <— oui mais cette IP est fausse :slight_smile:

Sans nom tu dois avoir raison (je ne suis pas spécialiste des site web) dans un cadre professionnel ou même de site complet, si j’ai bien compris ce que tu expliques, c’est filtre php sont la solution, mais si on reste dans le cadre d’un exercice, je pense que sur le coup l’objectif était l’utilisation des fonctions de traitements des String, et dans ces cas soit on test juste la présence d’un ‘@’ avec strpos() (il me semble) ou un REGEX pour le test de l’adresse mail complet.
Par contre willboy, tu as un erreur sur la structure d’une adresse mail.
Une adresse mail est composé d’un ou plusieurs bloques de caractères alphanumériques commençant par une lettre et séparé par un ‘.’ ou un ‘_’ (“underscore”), le ‘-’(tiret) n’est pas accepté, suivi d’un ‘@’ puis d’un bloque de caractère alphanumérique, d’un ‘.’ puis d’un groupe de 2 a 4 caractères alphabétique.


D'ailleurs je te remercie sans-nom car je ne connaissais pas cette méthode (je suis quasi-débutant en php, je suis plus spécialisé dans le développement d'application lourde), j'ai fais la mise à jour dans mon site, car je préfère cette méthode qui est dans un sens plus logique.

salut Akkai
tu est sur pour le - dans une adresse mail ???
je suis quasi debutant moi aussi en php mais je viens de reverifier dans un bouquin sur php et un autre sur java conscernant les adresse mail et apparament les caractere autoriser sont : . - _ ?
si quelqu’un peut m’eclairer .
mais bon de toute facons la solution le plus simple reste les filtre " merci sansnom … " .