Remplacement des !ereg

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Remplacement des !ereg

Re: Remplacement des !ereg

par AB » 31 mai 2012, 18:31

@Akirami, Et à ton avis à quoi sert "checkdnsrr" ?

Re: Remplacement des !ereg

par Akirami » 31 mai 2012, 17:55


Et donc au total le maximum "raisonnable" que l'on puisse faire pour valider un mail est :
function Valid_mail ($mail)

{
    $domaine = explode('@',$mail);

    return (filter_var($mail, FILTER_VALIDATE_EMAIL) !== false && isset($domaine[1]) && checkdnsrr($domaine[1]) === true)? true : false;
}



$mail = "[email protected]";

if (Valid_mail($mail)) echo 'mail_valid'; else echo 'mail_non_valide';
Je veux dire que tu peux vérifier l’existence d'un nom de domaine, pour que [email protected] existe il faut que http://free.fr existe.
Avec un explode on récupère le nom de domaine puis on teste son existence :
<?
$site = "http://free.fr/";
$file = @fopen($site, 'r'); 
if ($file) {
echo 'URL existe';
} 
else {
echo 'URL n\'existe pas !';
} 
?>

Re: Remplacement des !ereg

par AB » 31 mai 2012, 17:32

En même temps si c'est juste pour valider un mail tu peux utiliser filter_var
if(filter_var($email, FILTER_VALIDATE_EMAIL))
J'y avais pensé à cela mais cette méthode ne valide pas forcement qu'un mail, admin@localhost est validé par exemple.
Sans doute parce que c'est une syntaxe valide...

Par contre j'avais testé un script qui validait au moins la présence mais surtout l’existence d'un nom de domaine, je rechercherais si qq'un le veux.
c'est checkdnsrr (qui ne fonctionne sous window qu'à partir de php 5.3)

Et donc au total le maximum "raisonnable" que l'on puisse faire pour valider un mail est :
function Valid_mail ($mail)

{
    $domaine = explode('@',$mail);

    return (filter_var($mail, FILTER_VALIDATE_EMAIL) !== false && isset($domaine[1]) && checkdnsrr($domaine[1]) === true)? true : false;
}



$mail = "[email protected]";

if (Valid_mail($mail)) echo 'mail_valid'; else echo 'mail_non_valide';


Tu as tout intérêt à utiliser une fonction native php (filter_var) pour valider un mail standard. La syntaxe des mail peut évoluer (rien n'est figé dans le marbre) et en utilisant une fonction php au moins tu auras l'avantage que les nouvelles versions php de validation prendront en compte les évolutions.

Sinon il faudrait te tenir toi-même au courant des éventuelles évolutions de la syntaxe des mails, pour ensuite aller changer ton regex de validation dans ton code... vas-tu y penser ?

Re: Remplacement des !ereg

par Akirami » 31 mai 2012, 02:50

En même temps si c'est juste pour valider un mail tu peux utiliser filter_var
if(filter_var($email, FILTER_VALIDATE_EMAIL))
J'y avais pensé à cela mais cette méthode ne valide pas forcement qu'un mail, admin@localhost est validé par exemple.

Ceci dit, c'est aussi le cas de <input type ="email" ....

Par contre j'avais testé un script qui validait au moins la présence mais surtout l’existence d'un nom de domaine, je rechercherais si qq'un le veux.

Re: Remplacement des !ereg

par AB » 31 mai 2012, 02:11

En même temps si c'est juste pour valider un mail tu peux utiliser filter_var
if(filter_var($email, FILTER_VALIDATE_EMAIL))

Re: Remplacement des !ereg

par vincelufologue » 31 mai 2012, 00:04

j'avais pas fais gaffe a ce i lol

Re: Remplacement des !ereg

par Ryle » 30 mai 2012, 19:24

Ah mais dans mon masque je n'exclus pas les majuscules, elles sont tout à fait valides dans un mail, même si on a généralement l'habitude d'écrire les emails en minuscule ([email protected] est un format valide).

En fait j'ai ajouté l'option "i" à la fin de l'expression, qui demande justement de ne pas tenir compte de la casse, du coup "/[a-zA-Z]/" peut ainsi s'écrire "/[a-z]/i" ou "/[A-Z]/i" et autorise aussi bien les majuscules que les minuscules. Le seul intérêt, c'est d'alléger la syntaxe de ton masque afin de le rendre plus lisible et donc plus facile à comprendre/maintenir :)

Re: Remplacement des !ereg

par vincelufologue » 30 mai 2012, 17:32

Même si ça ne sert qu'au w3c au moin je sais comment sa s'utilise, ça peut toujours servir:)
Perso le slash c pas pour moi je le confonds trop avec l'antislash lool
Merci de vos réponses :)

Ps: suis pas si con j'avais inclu les majuscules a cause de l'iPhone qui les met automatiquement en début de phrase

Re: Remplacement des !ereg

par Akirami » 30 mai 2012, 17:18

A vrai dire, les navigateurs prennent en compte aujourd'hui le type d'input "email", même si ce n'est pas valide W3C, ça doit vraiment remonter à vieux cet attribut.

Re: Remplacement des !ereg

par kny » 30 mai 2012, 17:09

Aucune différence.
Le but est d'utiliser un caractère non utilisé en classe de masque, ou que tu aurais l'habitude d'utiliser dans tes masques sans quoi tu devrais l'échapper.
Personnellement j'utilise "~" (tilde) comme séparateur.

Re: Remplacement des !ereg

par vincelufologue » 30 mai 2012, 16:58

C'est vrai qu'il y a rarement de majuscule dans un email, con que je suis!! Par contre il y a une différence entre # et / ormis le fait de pouvoir se tromper entre smash et antislash?

Re: Remplacement des !ereg

par Ryle » 30 mai 2012, 16:48

Pour le masque en lui même, il n'y a à priori rien à modifier, en revanche il faut ajouter des délimiteurs de chaque côté de ton masque. En général on utilise le slash ( / ) ou le dièse ( # ) qui sont rarement utilisés dans les masques.

Ton test deviendrait
(!preg_match("/^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}[.][a-zA-Z]{2,4}$/", $POST["email"]))
Et du coup, tu peux même ajouter des options et alléger ton masque, par exemple en ignorant la casse :
(!preg_match("/^[a-z0-9._-]+@[a-z0-9._-]{2,}[.][a-z]{2,4}$/i", $POST["email"]))

Remplacement des !ereg

par vincelufologue » 30 mai 2012, 16:39

Bonjour, j'aimerai me débarrasser de ces !ereg pour les remplacer par des preg_match mais est ce que je dois simplement changer le !ereg ou je dois modifier autre chose ( par exemple la regex ou la mise en forme des scripts). Voilà un exemple:
(!ereg("^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}[.][a-zA-Z]{2,4}$",$POST["email"]))