web-dev-qa-db-fra.com

Le filtre_var_validate_validate_validate_validate_validate_validate_validate_validate-t-il?

Après avoir lu divers postes, j'ai décidé de ne pas utiliser Regex pour vérifier si un email est valide et utilisez simplement la fonction de filtre intégré de PHP. Il semblait travailler correctement, jusqu'à ce qu'il commence à me dire qu'un email était invalide car j'avais un numéro dedans.

ie [email protected] fonctionne, tandis que [email protected] ne le fait pas.

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

32
willdanceforfun

L'expression régulière utilisée dans le PHP 5.3.3 Le code filtrant est basée sur le blog de Michael Rushton sur validation de l'adresse e-mail . Il semble fonctionner pour le cas que vous mentionnez.

Vous pouvez également consulter certaines des options dans comparer l'adresse e-mail Validant des expressions régulières (le regexp actuellement utilisé dans PHP est l'un de ceux testés).

Ensuite, vous pouvez choisir une refente que vous préférez, et utilisez-la dans un appel à preg_match().

Ou bien, vous pouvez prendre le regexp et remplacer celui dans le fichier PHP/poste/filtre/logical_filter.c, fonction php_filter_validate_email() et reconstruire php.

33
Bill Karwin

[email protected] semble fonctionner correctement: http://codepad.org/5hdgmw5i

Mais j'ai définitivement vu des gens qui se plaignent, il a eu des problèmes, même à ce sujet. Selon toutes vraisemblances, cela a des problèmes, mais une solution de regex sera donc. Les spécifications d'adresse e-mail sont très compliquées ( RFC XXXX ).

C'est pourquoi la seule solution pour vérifier les courriels que vous devriez compter sur l'envoi d'un courrier électronique à l'adresse et à la demande d'action (par exemple: si c'est un script d'enregistrement, demandez-leur de cliquer sur un lien de vérification).

5
NullUserException
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('[email protected]', true));
    // bool(true)
1
James

ce filtre a été réaménagé récemment. http://codepad.org/lz5m2s2n - apparaît que dans la version utilisée par CodePad, votre cas est filtré correctement

Vous pouvez également consulter http://bugs.php.net/49576 et http://svn.php.net/viewvc/php/php-src/trunk/ext/ Filtre/logical_filters.c . Regexp est assez effrayant.

1
ts.