Le filtre var FILTER de PHP valide-t-il réellement le courriel?

après avoir lu divers messages, j'ai décidé de ne pas utiliser REGEX pour vérifier si un e-mail est valide et d'utiliser simplement la fonction filter_var intégrée à PHP. Ça avait l'air de marcher, jusqu'à ce qu'on me dise qu'un e-mail n'était pas valide parce que j'avais un numéro dedans.

ie name@domain.com travaux, tandis que name2@domain.com Non.

est-ce que je manque quelque chose ou est-ce que le filter_var($email, FILTER_VALIDATE_EMAIL) est vraiment inefficace?

31
demandé sur samayo 2010-09-16 04:20:04

4 réponses

l'expression régulière utilisée dans le code de filtre PHP 5.3.3 est basée sur le blog de Michael Rushton sur Validation de L'adresse Email . Cela semble fonctionner pour le cas que vous mentionnez.

vous pouvez également vérifier certaines des options dans comparer L'adresse E-mail validant les Expressions régulières (le regexp actuellement utilisé en PHP est l'un de ceux testés).

alors vous pouvez choisir un regexp que vous aimez mieux, et de l'utiliser dans un appel à preg_match() .

ou bien vous pouvez prendre le regexp et remplacer celui dans le fichier PHP/ext/filter/logical_filter.c, fonction php_filter_validate_email() , et recompiler PHP.

33
répondu Bill Karwin 2010-09-16 00:39:26

name2@domain.com ça a l'air de marcher.: http://codepad.org/5HDgMW5i

mais j'ai certainement vu des gens se plaindre qu'il y avait des problèmes, même ainsi. Selon toute vraisemblance, il y a des problèmes, mais une solution de regex aussi. Les spécifications d'adresse email sont très, très compliquées ( RFC XXXX ).

C'est pourquoi la seule solution pour vérifier les e-mails sur lesquels vous devez compter est d'envoyer un e-mail à la adresse et action de demande (par exemple: si c'est un script d'enregistrement, demandez-leur de cliquer sur un lien de vérification).

5
répondu NullUserException 2010-09-16 00:25:29

ce filtre a été remanié récemment. http://codepad.org/Lz5m2S2N - apparaît que dans la version utilisée par codepad votre cas est filtré correctement ""

vous pouvez aussi regarder http://bugs.php.net/49576 et http://svn.php.net/viewvc/php/php-src/trunk/ext/filter/logical_filters.c . Regexp est assez effrayant.

1
répondu ts. 2010-09-16 00:35:43
function isValidEmail($email, $checkDNS = false)
{

    $valid = (
            /* Preference for native version of function */
            function_exists('filter_var') and filter_var($email, FILTER_VALIDATE_EMAIL)
            ) || (
                /* The maximum length of an e-mail address is 320 octets, per RFC 2821. */
                strlen($email) <= 320
                /*
                 * The regex below is based on a regex by Michael Rushton.
                 * However, it is not identical. I changed it to only consider routeable
                 * addresses as valid. Michael's regex considers a@b a valid address
                 * which conflicts with section 2.3.5 of RFC 5321 which states that:
                 *
                 * Only resolvable, fully-qualified domain names (FQDNs) are permitted
                 * when domain names are used in SMTP. In other words, names that can
                 * be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed
                 * in Section 5) are permitted, as are CNAME RRs whose targets can be
                 * resolved, in turn, to MX or address RRs. Local nicknames or
                 * unqualified names MUST NOT be used.
                 *
                 * This regex does not handle comments and folding whitespace. While
                 * this is technically valid in an email address, these parts aren't
                 * actually part of the address itself.
                 */
                and preg_match_all(
                    '/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?))'.
                    '{255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?))'.
                    '{65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|'.
                    '(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))'.
                    '(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|'.
                    '(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|'.
                    '(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})'.
                    '(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\.){1,126})'.'{1,}'.
                    '(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|'.
                    '(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|'.
                    '(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::'.
                    '(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|'.
                    '(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|'.
                    '(?:(?!(?:.*[a-f0-9]:){5,})'.'(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::'.
                    '(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|'.
                    '(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|'.
                    '(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD',
                    $email)
            );

    if( $valid )
    {
        if( $checkDNS && ($domain = end(explode('@',$email, 2))) )
        {
            /*
            Note:
            Adding the dot enforces the root.
            The dot is sometimes necessary if you are searching for a fully qualified domain
            which has the same name as a host on your local domain.
            Of course the dot does not alter results that were OK anyway.
            */
            return checkdnsrr($domain . '.', 'MX');
        }
        return true;
    }
    return false;
}


//-----------------------------------------------------------------

    var_dump(isValidEmail('nechtan@tagon8inc.com', true));
    // bool(true)
1
répondu James 2014-05-21 22:08:44