symfony sfEmailValidator
Posté : 19 févr. 2009, 03:40
Voici le fruit de mes recherches 
Problématique : Validé un email avec symfony et sans accès internet
J'ai jetté un coup d'oeil dans le sfEmailValidator dans le but d'utiliser autrepart la regex
elle est assez balèse et provient d'un article intéressant sur la validation des e-mails : http://iamcal.com/publish/articles/php/ ... email/pdf/
Donc je me suis pas embeté
J'ai donc cherché dans l'article le pourquoi du comment, la réponse est simple : cette regex respecte au poil près la RFC, on vérifie donc que le format est valide mais pas si c'est une adresse e-mail internet valide et toute la nuance est là!
C'est pour ça que symfony utilise la vérification du domain via http://fr.php.net/checkdnsrr
Donc pour valider des e-mails avec symfony sans accès internet, il faut éviter le sfEmailValidator sous peine d'avoir des e-mails incorrects.
Voici une regex pas trop mal qui fera le travail dans 99,999% des cas
Avec l'espoir que ce post puisse servir à éviter des migraines
[/b]
Problématique : Validé un email avec symfony et sans accès internet
J'ai jetté un coup d'oeil dans le sfEmailValidator dans le but d'utiliser autrepart la regex
elle est assez balèse et provient d'un article intéressant sur la validation des e-mails : http://iamcal.com/publish/articles/php/ ... email/pdf/
Donc je me suis pas embeté
/**
* Check if a an email address is valid or not
*
* @param string $mail
*
* @return boolean
*/
public static function isValidMail($mail)
{
$re = '/^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-'
.'\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c\\x00-'
.'\\x7f)*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-'
.'\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80'
.'-\\xff]|\\x5c\\x00-\\x7f)*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29'
.'\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^'
.'\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*\\x5d)(\\x2e([^\\x00-'
.'\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-'
.'\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*'
.'\\x5d))*$/'
;
if (!preg_match($re, $mail)) {
return false;
}
return true;
}
Et là lors de mes test à ma grand surprise, les adresses de type "xxx@xxx" sont dites valides!!J'ai donc cherché dans l'article le pourquoi du comment, la réponse est simple : cette regex respecte au poil près la RFC, on vérifie donc que le format est valide mais pas si c'est une adresse e-mail internet valide et toute la nuance est là!
C'est pour ça que symfony utilise la vérification du domain via http://fr.php.net/checkdnsrr
Donc pour valider des e-mails avec symfony sans accès internet, il faut éviter le sfEmailValidator sous peine d'avoir des e-mails incorrects.
Voici une regex pas trop mal qui fera le travail dans 99,999% des cas
Code : Tout sélectionner
^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$
Avec l'espoir que ce post puisse servir à éviter des migraines
[/b]