Cách dễ nhất và an toàn nhất để kiểm tra xem địa chỉ email có được định dạng tốt hay không là sử dụng filter_var()
chức năng:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}
Ngoài ra, bạn có thể kiểm tra xem tên miền có xác định MX
bản ghi hay không:
if (!checkdnsrr($domain, 'MX')) {
// domain is not valid
}
Nhưng điều này vẫn không đảm bảo rằng thư tồn tại. Cách duy nhất để tìm ra điều đó là bằng cách gửi thư xác nhận.
Bây giờ bạn đã có câu trả lời dễ dàng, hãy đọc về xác thực địa chỉ email nếu bạn muốn tìm hiểu hoặc chỉ cần sử dụng câu trả lời nhanh và tiếp tục. Không cảm thấy khó khăn.
Cố gắng xác thực địa chỉ email bằng regex là một nhiệm vụ "không thể". Tôi sẽ đi xa hơn để nói rằng regex bạn đã thực hiện là vô dụng. Có ba rfc liên quan đến các địa chỉ email và viết một biểu thức chính quy để bắt các địa chỉ email sai và đồng thời không có kết quả sai là điều không thể làm được. Kiểm tra danh sách này để kiểm tra (cả thất bại và thành công) của biểu thức chính được sử dụng bởi filter_var()
chức năng của PHP .
Ngay cả các chức năng PHP tích hợp, ứng dụng email hoặc máy chủ cũng không được thực hiện đúng. Vẫn trong hầu hết các trường hợp filter_var
là lựa chọn tốt nhất.
Nếu bạn muốn biết mẫu biểu thức regex nào mà PHP (hiện tại) sử dụng để xác thực các địa chỉ email, hãy xem nguồn PHP .
Nếu bạn muốn tìm hiểu thêm về địa chỉ email, tôi khuyên bạn nên bắt đầu đọc thông số kỹ thuật, nhưng tôi phải cảnh báo bạn rằng đây không phải là một cách dễ dàng để đọc được:
Lưu ý rằng filter_var()
như đã nêu chỉ có sẵn kể từ PHP 5.2. Trong trường hợp bạn muốn nó hoạt động với các phiên bản PHP trước đó, bạn có thể sử dụng biểu thức chính được sử dụng trong PHP:
<?php
$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';
$emailaddress = 'test@gmail.com';
if (preg_match($pattern, $emailaddress) === 1) {
// emailaddress is valid
}
PS Một lưu ý về mẫu biểu thức chính được sử dụng ở trên (từ nguồn PHP). Có vẻ như có một số bản quyền về nó của Michael Rushton . Như đã nêu: "Hãy sử dụng và phân phối lại mã này. Nhưng vui lòng giữ thông báo bản quyền này."
validateEmail
sẽ được sửa chữa, cũng như vượt qua$email
, không$EMAIL
.