2010-08-31 46 views
25

PHPiçin Preg'ü kullanarak en iyi e-posta doğrulama, bu kaldırılmış çünkü/ kaldırıldıDEĞİLEreg ne.PHP eposta doğrulama

ben (maksimum güvenliği gibi değil) web sitesi varlığının kontrol edilmesi gerekmez yoktur.

ereg ile birçok yol buldum ama onlar (belli ki) iyi uygulama değiller.

cevap

78

Sana FILTER_VALIDATE_EMAIL filtre kullanın öneririz: Ayrıca doğrudan its regular expression kullanabilirsiniz

if (filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    //valid 
} 

:

"/^(?!(?:(?:\\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" 

Ama bu durumda

, bir hata normal ifadede bulunursa, sen' PHP'yi güncellemek yerine programınızı güncellemeliyim.

+1

email ayrıca karakter içerebilir unutmayın: ' '/ *'. Yani bu doğrulama, DB'yi güvenli yapmaz. –

+0

filter_var() benim için yeni. FILTER_VALIDATE_EMAIL iyi mi? Kaynak kod referansı için – Marwelln

+0

+1. Mükemmel –

3

very very long regular expressions'u kullanmak istemediğiniz sürece, geçerli olmayan geçerli e-posta adresleriyle karşılaşırsınız (Unicode'u düşünün). Sahte e-posta adresleri de geçerli olarak geçer, bu nedenle [email protected] yazıp ondan kurtulursanız, doğrulama noktası nedir?

E-posta adreslerini doğrulamanın en iyi yolu, tıklamak için bir bağlantı içeren bir onay e-postası göndermektir. Bu sadece e-posta adresi geçerli olduğunda çalışır: kolay ve normal ifadeye gerek yok.

+0

basitçe söylediğim gibi, maksimum güvenlik gibi değil –

+4

Makul bir Geliştirici, "string" e bir e-posta göndermeyi denemeden ÖNCE, verilen bir adresin geçerliliğini kontrol edecektir. Yani bu bir argüman değil. Ancak Doupble-opt-in yine de yapılmalıdır - bu soru değildi. –

+0

@Jan .: Peki, e-posta adresim àeìòù@mydomain.com ise ve önleyici kontrolünüz sitenize kaydolmamı engelliyorsa ne olur? Sadece bir onay e-postası gönderirsiniz ve belirlenir, daha önce geçerliliği kontrol edilmesine ve geçerli e-posta adreslerini engelleme riskiyle karşılaşmanıza gerek yoktur. – nico

0
function check_email($check) { 
$expression = "/^[a-zA-Z0-9._-][email protected][a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$/"; 
if (preg_match($expression, $check)) { 
    return true; 
} else { 
    return false; 
} 
} 

Çağrı onu örnek aşağıdaki gibi if() koşulu:

if(!check_email($_REQUEST['ContactEmail'])){ 
    $register_error ="Enter the correct email address!<br />"; 
    $reg_error=1; 
} 
+0

kimse bana bu koddaki sorunun ne olduğunu bir kişi oylamada bir kişi bana söyleyebilir. İyi çalışıyor. –

+0

Oy verdiğim o oy değildi ama .... e-posta adreslerini doğru bir şekilde filtrelemek doğru değil, burada bulunan doğru ve eksiksiz regex: http://www.ex-parrot.com/~ pdw/Mail-RFC822-Address.html İkinci olarak, FILTER_VALIDATE_EMAIL adresinde yerleşik PHP'nin kullanılması, bir e-posta adresini filtrelemenin doğru/en iyi yolu olacaktır – twigg