복붙노트

PHP로 전자 메일의 유효성을 검사하는 방법은 무엇입니까?

PHP

PHP로 전자 메일의 유효성을 검사하는 방법은 무엇입니까?

입력 값의 유효성을 검사하는 방법은 php5를 사용하는 유효한 이메일 주소입니다. 이제이 코드를 사용하고 있습니다.

function isValidEmail($email){ 
     $pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"; 

     if (eregi($pattern, $email)){ 
        return true; 
     } 
     else { 
        return false; 
     }    
} 

하지만 더 이상 사용되지 않는 오류가 표시됩니다. 이 문제를 어떻게 해결할 수 있습니까? 도와주세요.

해결법

  1. ==============================

    1.filter_var () 함수를 사용하면 여러 가지 유용한 유효성 검사 옵션과 위생 옵션을 얻을 수 있습니다.

    filter_var () 함수를 사용하면 여러 가지 유용한 유효성 검사 옵션과 위생 옵션을 얻을 수 있습니다.

    filter_var($email, FILTER_VALIDATE_EMAIL)
    

    함수에 의존하는 코드를 변경하지 않으려면 다음을 수행하십시오.

    function isValidEmail($email){ 
        return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
    }
    

    참고 : 다른 용도 (Regex가 필요한 곳)에서는 더 이상 사용되지 않는 ereg 함수 계열 (POSIX Regex Functions)을 preg 계열 (PCRE Regex Functions)로 대체해야합니다. 차이점은 적지 만 설명서를 읽으면 충분합니다.

    업데이트 1 : @binaryLV가 지적한대로 :

    이 버그는 이미 수정되었습니다.

    업데이트 2 : 물론이 방법은 유효 이메일 주소이기 때문에 유효 이메일 주소로 bazmega @ kapa를 검증합니다. 하지만 대부분의 경우 인터넷에서 이메일 주소에 TLD (bazmega@kapa.com)가 있어야합니다. 이 블로그 게시물 (@Istiaque Ahmed가 게시 한 링크)에서 제안한 것처럼, 도메인 부분에 점의 존재를 확인하는 정규식을 사용하여 filter_var ()를 보완 할 수 있습니다 (유효한 TLD는 확인하지 않음).

    function isValidEmail($email) {
        return filter_var($email, FILTER_VALIDATE_EMAIL) 
            && preg_match('/@.+\./', $email);
    }
    

    @Eliseo Ocampos가 지적했듯이이 문제는 PHP 5.3 이전 버전에만 존재합니다. 그 버전에서는 정규식을 변경 했으므로 이제는이 검사를 수행하므로 필요 없습니다.

  2. ==============================

    2.http://www.php.net/manual/en/function.ereg.php의 메모를 참조하십시오.

    http://www.php.net/manual/en/function.ereg.php의 메모를 참조하십시오.

  3. ==============================

    3.이것은 오래된 게시물이지만 이전에 한 가지 문제에 대해 아무도 언급하지 않았기 때문에 제 솔루션을 공유 할 것입니다.

    이것은 오래된 게시물이지만 이전에 한 가지 문제에 대해 아무도 언급하지 않았기 때문에 제 솔루션을 공유 할 것입니다.

    새 이메일 주소에는 UTF-8 문자 또는 .live, .news 등의 특수 도메인 이름이 포함될 수 있습니다.

    또한 일부 전자 메일 주소는 키릴 문자를 사용할 수 있으며 표준 정규식이나 filter_var ()가 실패 할 수 있습니다.

    그래서 그것을위한 해결책을 만들었습니다.

    function valid_email($email) 
    {
        if(is_array($email) || is_numeric($email) || is_bool($email) || is_float($email) || is_file($email) || is_dir($email) || is_int($email))
            return false;
        else
        {
            $email=trim(strtolower($email));
            if(filter_var($email, FILTER_VALIDATE_EMAIL)!==false) return $email;
            else
            {
                $pattern = '/^(?!(?:(?:\\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';
                return (preg_match($pattern, $email) === 1) ? $email : false;
            }
        }
    }
    

    이 기능은 모든 케이스 및 전자 메일 형식에 완벽하게 작동합니다.

  4. ==============================

    4.나는 항상 이것을 사용한다.

    나는 항상 이것을 사용한다.

    function validEmail($email){
        // First, we check that there's one @ symbol, and that the lengths are right
        if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {
            // Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
            return false;
        }
        // Split it into sections to make life easier
        $email_array = explode("@", $email);
        $local_array = explode(".", $email_array[0]);
        for ($i = 0; $i < sizeof($local_array); $i++) {
            if (!preg_match("/^(([A-Za-z0-9!#$%&'*+\/=?^_`{|}~-][A-Za-z0-9!#$%&'*+\/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$/", $local_array[$i])) {
                return false;
            }
        }
        if (!preg_match("/^\[?[0-9\.]+\]?$/", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
            $domain_array = explode(".", $email_array[1]);
            if (sizeof($domain_array) < 2) {
                return false; // Not enough parts to domain
            }
            for ($i = 0; $i < sizeof($domain_array); $i++) {
                if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) {
                    return false;
                }
            }
        }
    
        return true;
    }
    
  5. ==============================

    5.전자 메일의 유효성을 검사하는 regex 및 filter_var () 솔루션을 사용하지 마십시오. 이 답변보기 : https://stackoverflow.com/a/42037557/953833

    전자 메일의 유효성을 검사하는 regex 및 filter_var () 솔루션을 사용하지 마십시오. 이 답변보기 : https://stackoverflow.com/a/42037557/953833

  6. from https://stackoverflow.com/questions/5855811/how-to-validate-an-email-in-php by cc-by-sa and MIT license