PHP에서 이메일을 확인하는 방법은 무엇입니까?


120

입력 값이 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; 
     }    
} 

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


3
정답은 이미 주어졌지만 더 이상 사용되지 않는 문제 와 관련하여 : POSIX 정규 표현식 ( eregi함수)의 사용은 더 이상 사용되지 않습니다. 대신 PCRE 를 사용하십시오 .
Felix Kling

3
그건 그렇고, 귀하의 정규식은 완전히 잘못되었습니다. 일부 완전히 유효한 주소는 함수에 의해 유효하지 않은 것으로 표시됩니다. 정규식으로 이메일 주소를 필터링하는 것은 악몽입니다.
Artefact2

RFC 822 표준을 사용해야 하며 여기 에 PHP에서 이메일 주소 구문 분석 을 설명 하는 좋은 기사가 있습니다.
kta 2014 년

답변:


275

filter_var()기능을 사용하면 편리한 유효성 검사 및 살균 옵션이 많이 제공됩니다.

filter_var($email, FILTER_VALIDATE_EMAIL)

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

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

참고 : 다른 용도 (Regex가 필요한 경우)의 경우 더 이상 사용되지 않는 ereg함수 계열 (POSIX Regex 함수)을 preg계열 ( PCRE Regex 함수 ) 로 대체해야합니다 . 약간의 차이가 있으므로 매뉴얼을 읽는 것으로 충분합니다.

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

PHP 5.3.3 및 5.2.14에는 FILTER_VALIDATE_EMAIL과 관련된 버그 가있어 큰 값을 확인할 때 segfault가 발생했습니다. 이에 대한 간단하고 안전한 해결 방법은 strlen() before를 사용하는 것 filter_var()입니다. 5.3.4 최종 버전은 확실하지 않지만 일부 5.3.4 스냅 샷 버전도 영향을 받았다고 기록되어 있습니다.

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

업데이트 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 전에 존재 해당 버전에 그들은 정규 표현식을 변경 하고 당신이하지 않아도 지금은이 검사를 수행합니다.


4
+1 즉, 이것은 PHP 5.2.x 이상에서만 사용할 수 있음을 언급 할 수 있습니다. :-)
John Parker

5
@middaparka : OP가에 대한 더 이상 사용되지 않는 메시지를 받으면 eregi그는 PHP 5.3을 사용하는 것 같습니다. 그러나 예, (다른 사람의 경우) 언급하는 것이 중요합니다.)
Felix Kling

8
PHP 5.3.3 및 5.2.14 에는와 관련된 버그 ( bugs.php.net/52929 ) 가있어 FILTER_VALIDATE_EMAIL큰 값을 확인할 때 segfault가 발생했습니다. 이에 대한 간단하고 안전한 해결 방법은 strlen()before를 사용하는 것 filter_val()입니다. 5.3.4 최종 버전은 확실하지 않지만 일부 5.3.4 스냅 샷 버전도 영향을 받았다고 기록되어 있습니다.
binaryLV

1
@binaryLV filter_val또는 filter_var?
Istiaque Ahmed

3
@kapa, 실제로 도메인 부분에서 점을 확인하기 위해 더 이상 필요하지 않습니다. svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/filter/…
Eliseo Ocampos


7

이것은 오래된 게시물이지만 아무도 여기에 한 가지 문제를 언급하지 않았기 때문에 내 솔루션을 공유하겠습니다.

새로운 이메일 주소는 UTF-8 자 같은 특수 도메인 이름을 포함 할 수 있습니다 .live, .news

또한 일부 이메일 주소가 Cyrilic 및 모든 경우 표준 정규식에 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;
        }
    }
}

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


3

나는 항상 이것을 사용합니다 :

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;
}

1
@unbreak 귀하의 코드를 시도한 결과 이메일을 전달 alex@.하면 유효한 이메일 주소가 아닌 경우 항상 true를 반환합니다.
Subhajit



0

사용자 데이터는 좋은 개발자에게 매우 중요하므로 동일한 데이터를 반복해서 요청하지 말고 일부 논리를 사용하여 데이터의 기본 오류를 수정하십시오.

이메일 확인 전 : 먼저 이메일에서 모든 불법 문자를 제거해야합니다.

//This will Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

filter_var()기능을 사용하여 이메일 주소를 확인하십시오 .

filter_var($email, FILTER_VALIDATE_EMAIL)) // To Validate the email

예를 들어

<?php
$email = "john.doe@example.com";

// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

// Validate email
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo $email." is a valid email address";
} else {
    echo $email." is not a valid email address";
}
?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.