2010-08-31 13 views
25

Đối PHP xác nhận email tốt nhất sử dụng preg, KHÔNGereg vì nó bị phản đối/gỡ bỏ là gì.PHP xác nhận email

I không cần kiểm tra xem trang web có tồn tại hay không (không giống như bảo mật tối đa).

Tôi đã tìm thấy nhiều cách với ereg nhưng chúng (rõ ràng) không phải là phương pháp hay.

Trả lời

78

tôi khuyên bạn sử dụng FILTER_VALIDATE_EMAIL lọc:

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

Bạn cũng có thể sử dụng its regular expression trực tiếp:

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

Nhưng trong trường hợp đó, nếu một lỗi được tìm thấy trong các biểu thức chính quy, bạn' sẽ phải cập nhật chương trình của bạn thay vì chỉ cập nhật PHP.

+1

Hãy ghi nhớ rằng một email cũng có thể chứa các ký tự: ' '/ *'. Vì vậy, việc xác thực này không làm cho DB an toàn. –

+0

filter_var() là mới đối với tôi. FILTER_VALIDATE_EMAIL có tốt không? – Marwelln

+0

+1 để tham khảo mã nguồn. tuyệt vời –

3

Trừ khi bạn muốn sử dụng số very very long regular expressions bạn sẽ chạy vào địa chỉ email hợp lệ không được đề cập (nghĩ Unicode). Ngoài ra các địa chỉ email giả mạo cũng sẽ có hiệu lực, vì vậy điểm xác thực là gì nếu bạn chỉ cần viết [email protected] và thoát khỏi nó?

Cách tốt nhất để xác thực địa chỉ email là gửi email xác nhận có liên kết để nhấp. Điều này sẽ chỉ hoạt động nếu địa chỉ email hợp lệ: dễ dàng và không cần sử dụng regex.

+0

đơn giản như tôi đã nói, nó không giống như bảo mật tối đa –

+4

Một nhà phát triển hợp lý sẽ kiểm tra một địa chỉ cụ thể cho tính hợp lệ TRƯỚC KHI cố gắng gửi một email đến "chuỗi". Vì vậy, đây không phải là một đối số. Nhưng Doupble-opt-in nên được thực hiện anyway - đó không phải là câu hỏi. –

+0

@Jan .: Vì vậy, nếu email của tôi là àèìòù@mydomain.com và séc ưu tiên của bạn ngăn tôi đăng ký vào trang web của bạn thì sao? Chỉ cần gửi email xác nhận và bạn đã đặt, không cần phải kiểm tra tính hợp lệ trước và có nguy cơ chặn địa chỉ email hợp lệ. – 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; 
} 
} 

Gọi nó trong if() tình trạng như sau Ví dụ:

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

bất cứ ai có thể cho tôi biết vấn đề trong mã này bcz một người xuống bỏ phiếu là gì. Nó hoạt động tốt. –

+0

Nó không phải là tôi mà xuống bình chọn nhưng .... đó không phải là một chính xác để lọc đúng địa chỉ e-mail, regex chính xác và đầy đủ được tìm thấy ở đây: http://www.ex-parrot.com/~ pdw/Mail-RFC822-Address.html Thứ hai sử dụng PHP được xây dựng trong FILTER_VALIDATE_EMAIL sẽ là cách tốt nhất để lọc địa chỉ e-mail – twigg