PHP'de bir E-posta nasıl doğrulanır?


120

Giriş değerinin php5 kullanarak geçerli bir e-posta adresi olduğunu nasıl doğrulayabilirim. Şimdi bu kodu kullanıyorum

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

ancak kullanımdan kaldırılmış hatayı gösterir. Bu sorunu nasıl düzeltebilirim? Lütfen bana yardım et.


3
Doğru cevap zaten verilmişti, ancak kullanımdan kaldırılan sorunla ilgili olarak : POSIX normal ifadelerinin ( eregibir işlevi olan) kullanımı kullanımdan kaldırıldı. Kullanım PCRE yerine.
Felix Kling

3
Bu arada, normal ifadeniz tamamen yanlış. Tamamen geçerli bazı adresler, işleviniz tarafından geçersiz olarak işaretlenecektir. Bir regex ile e-posta adreslerini filtrelemek bir kabustur.
Artefact2

RFC 822 standardını kullanmalısınız ve işte bunu açıklayan PHP'de E-posta Adreslerini Ayrıştırma iyi bir makale .
kta

Yanıtlar:


275

Size filter_var()birçok kullanışlı doğrulama ve temizleme seçeneği sunan işlevi kullanabilirsiniz .

filter_var($email, FILTER_VALIDATE_EMAIL)

İşlevinize dayanan kodunuzu değiştirmek istemiyorsanız, yapmanız gereken:

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

Not : Diğer kullanımlar için (Regex'e ihtiyacınız olduğunda), kullanımdan kaldırılan eregişlev ailesi (POSIX Regex İşlevleri), pregaile ( PCRE Regex İşlevleri ) ile değiştirilmelidir. Küçük farklılıklar var, Kılavuzu okumak yeterli olacaktır.

Güncelleme 1 : @binaryLV tarafından belirtildiği gibi :

PHP 5.3.3 ve 5.2.14, FILTER_VALIDATE_EMAIL ile ilgili bir hataya sahipti , bu da büyük değerleri doğrularken segfault ile sonuçlandı. Bunun için basit ve güvenli bir çözüm daha strlen() önce kullanılıyor filter_var(). 5.3.4 finalden emin değilim, ancak bazı 5.3.4 anlık görüntü sürümlerinin de etkilendiği yazılıyor.

Bu hata zaten düzeltildi.

Güncelleme 2 : Bu yöntem elbette bazmega@kapageçerli bir e-posta adresi olarak doğrulanacaktır , çünkü aslında geçerli bir e-posta adresidir. Ama internette çoğu zaman, aynı zamanda e-posta adresi TLD'yi istiyorum: bazmega@kapa.com. Bu da önerildiği gibi blog post (bağlantı tarafından gönderildi @Istiaque Ahmed ) kullanarak, çoğaltmak olabilir filter_var()(bir kontrol etmeyeceği alanı bölümünde bir noktanın bulunmadığını kontrol eder bir regex ile geçerli TLD gerçi):

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

@Eliseo Ocampos'un belirttiği gibi , bu sorun sadece PHP 5.3'ten önce var, o sürümde regex'i değiştirdiler ve şimdi bu kontrolü yapıyor, yani sizin zorunda değilsiniz.


4
+1 Bununla birlikte, bunun yalnızca PHP 5.2.x ve üzeri sürümlerde mevcut olduğunu belirtmek isteyebilirsiniz. :-)
John Parker

5
@middaparka: OP, kullanımdan kaldırılmış bir mesaj eregialdığından, PHP 5.3 kullanıyor gibi görünüyor. Ama evet, bundan bahsetmek önemlidir (diğerleri için).
Felix Kling

8
PHP 5.3.3 ve 5.2.14'teFILTER_VALIDATE_EMAIL büyük değerler doğrulanırken segfault ile sonuçlanan bir hata ( bugs.php.net/52929 ) vardı . Bunun için basit ve güvenli bir çözüm daha strlen()önce kullanılıyor filter_val(). 5.3.4 finalden emin değilim, ancak bazı 5.3.4 anlık görüntü sürümlerinin de etkilendiği yazılıyor.
binaryLV

1
@binaryLV filter_valveya filter_var?
Istiaque Ahmed

3
@kapa, Aslında etki alanı bölümünde bir noktayı kontrol etmek için artık ihtiyacınız yok. Svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/filter/…
Eliseo Ocampos


7

Bu eski bir gönderi ama benim çözümümden birini paylaşacağım çünkü burada daha önce kimse bir sorundan bahsetmiyor.

Yeni e-posta adresi UTF-8 karakterleri veya benzeri özel alan adları içerebilir .live, .newsvb

Ayrıca, bazı e-posta adreslerinin Kiril alfabesinde olabileceğini ve her durumda standart normal ifadede bulunabileceğini veya filter_var()başarısız olacağını görüyorum.

Bu yüzden bunun için bir çözüm yaptım:

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

Bu işlev tüm vakalar ve e-posta formatları için mükemmel çalışır.


3

Ben her zaman şunu kullanırım:

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 Kodunuzu denedim ve e-postayı bu şekilde geçirirseniz alex@., geçerli bir e-posta adresi olmadığı durumlarda her zaman doğru döndürdüğünü gördüm .
Subhajit



0

Kullanıcı verileri iyi bir geliştirici için çok önemlidir, bu nedenle aynı verileri tekrar tekrar sormayın, verilerdeki bazı temel hataları düzeltmek için biraz mantık kullanın.

E -postanın doğrulanmasından önce: Öncelikle, tüm geçersiz karakterleri e-postadan kaldırmanız gerekir.

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

daha sonra bu filter_var()işlevi kullanarak e-posta adresinizi doğrulayın .

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

Örneğin

<?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";
}
?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.