2008-10-02 25 views
7

Tôi cần xác thực địa chỉ email của người dùng của mình. Thật không may, làm cho một validator rằng comforms to standards khóCó thư viện php để xác thực địa chỉ email không?

Here là một ví dụ của một biểu thức regex mà cố gắng để comform tiêu chuẩn

Có bất kỳ thư viện PHP (tốt, mã nguồn mở) mà xác nhận địa chỉ email?

+0

chúng ta có đang nói e-mail hoặc địa chỉ email không? – Sietse

+0

Tôi có nghĩa là địa chỉ email. Tôi đã sửa lại câu hỏi của mình để phản ánh điều đó. Cảm ơn – MrValdez

Trả lời

16

Bạn đã xem PHP's filter_ functions chưa? Họ không hoàn hảo, nhưng họ làm một công việc khá tốt trong kinh nghiệm của tôi.

Ví dụ sử dụng (lợi nhuận boolean):

filter_var($someEmail, FILTER_VALIDATE_EMAIL);

+0

Tôi đang mã hóa một ứng dụng đơn giản (phi doanh nghiệp) cần có trình xác thực cơ bản. Mặc dù FILTER_VALIDATE_EMAIL dường như không triển khai đầy đủ thông số - ví dụ: nó không thực hiện được một số thử nghiệm tại http://code.iamcal.com/php/rfc822/rfc822.phps - dường như là "đủ tốt" cho nhu cầu hiện tại của tôi. Cảm ơn! –

12

AFAIK, cách duy nhất tốt để xác nhận một e-mail là để gửi một e-mail và xem nếu người dùng đi quay lại trang web bằng cách sử dụng một liên kết trong e-mail này. Đó là những gì nhiều trang web làm.

Khi bạn chỉ ra với liên kết đến regex khổng lồ nổi tiếng, xác nhận tất cả các dạng địa chỉ e-mail là khó, gần như không thể. Nó rất dễ dàng để làm điều đó sai, ngay cả đối với e-mail phong cách tầm thường (tôi tìm thấy quá nhiều trang web từ chối mũ trong địa chỉ e-mail! Và hầu hết các regex cũ từ chối TLDs của hơn 4 chữ cái!).

AFAIK, "Jean-Luc B. O'Grady" @ example.com và e = mc^2 @ [82.128.45.117] đều là địa chỉ hợp lệ ... Trong khi I-Made-It-Up @ Absurd- Domain-Name.info có thể không hợp lệ. Vì vậy, bằng cách nào đó, tôi sẽ chỉ kiểm tra xem chúng tôi có gì đó, một cái gì đó độc đáo, cái gì khác, và đi với nó: nó sẽ bắt hầu hết các lỗi của người dùng (như trường trống hoặc tên người dùng thay vì địa chỉ e-mail.).
Nếu người dùng muốn cung cấp một địa chỉ giả mạo, nó sẽ chỉ cung cấp cho một cái gì đó ngẫu nhiên tìm kiếm chính xác ([email protected] hoặc [email protected]). Và không có trình xác nhận nào sẽ bắt lỗi chính tả ([email protected] thay vì [email protected]).

Nếu thực sự muốn xác thực e-mail chống lại RFC đầy đủ, tôi khuyên bạn nên sử dụng các regex để chia nhỏ xung quanh @, sau đó kiểm tra tên và tên miền riêng biệt. Trường hợp riêng biệt của tên địa phương bắt đầu bằng "từ các trường hợp khác, v.v. Tách biệt tên miền bắt đầu bằng [từ các trường hợp khác, v.v. Phân tách vấn đề trong các miền cụ thể nhỏ hơn và chỉ sử dụng các regex trên một trường hợp được xác định rõ ràng, đơn giản hơn.
tư vấn có thể được áp dụng cho nhiều mục đích sử dụng regex, tất nhiên ...

+0

Đó là câu trả lời hợp lệ và những gì tôi thường làm. Nhưng đối với khách hàng cụ thể này, tôi cần một cách để kiểm tra xem email có hợp lệ hay không. Cách thay thế để xác thực email yêu cầu người dùng nhập email của họ hai lần, điều mà tôi thật sự bác bỏ. Hy vọng rằng, tôi có thể thuyết phục họ không làm điều này. – MrValdez

+0

Có vấn đề gì khi nhập hai lần? Đó là một cách nhanh chóng, rẻ tiền và dễ dàng để đảm bảo rằng người dùng không đánh dấu địa chỉ email của họ trong khi nhập. Nếu bạn * thực sự * cần xác minh rằng địa chỉ email có định dạng hợp lệ, câu trả lời của Dominic (và được liên kết trang web) dường như chứa thông tin toàn diện nhất mà tôi đã nhìn thấy. – afrazier

+2

@afrazier: "Có vấn đề gì với mục nhập kép?" Vâng, nếu mọi người làm như tôi, họ chỉ cần sao chép/dán mục nhập đầu tiên vào mục thứ hai, vì vậy lợi ích là không ... – PhiLho

1

Zend_Validate bao gồm một validator email

có rất nhiều biểu thức thông thường xung quanh để phê chuẩn -.. tất cả mọi thứ từ rất cơ bản đến rất tiên tiến Bạn thực sự nên chọn thứ gì đó phù hợp với tầm quan trọng của email hợp lệ trong đơn đăng ký của bạn.

0

Tôi khuyên bạn nên xem mã nguồn của Zend_Validate_EmailAddress [source].

một khi bạn đã phụ thuộc của bạn cố định bạn chỉ có thể làm như sau:

$mail_validator = new Zend_Validate_EmailAddress(); 
$mail_validator->isValid($address); // returns true or false 

tốt nhất là để có được đầy đủ Zend Library vào dự án của bạn thông qua svn bên ngoài và chỉ con đường bao gồm để nó ...

nhưng bạn chỉ có thể tải các tập tin cần thiết (1, 2, 3, 4, 5, 6), và bao gồm tất cả (loại bỏ các cuộc gọi require_once)

8

Cal Henderson (của Flickr) đã viết một RFC822 compliant email address matcher, với giải thích về RFC và mã sử dụng RFC để khớp với địa chỉ email. Tôi đã sử dụng nó khá lâu rồi mà không có khiếu nại.

RFC822 (xuất bản năm 1982) định nghĩa, giữa những thứ khác, định dạng cho tin nhắn văn bản internet (email) địa chỉ. Bạn có thể tìm thấy RFC bằng cách googling - có rất nhiều bản sao của chúng trực tuyến. Chúng là một chút ngắn gọn và được định dạng kỳ lạ, nhưng với một nỗ lực rất nhỏ, chúng tôi có thể xem chúng là số nhận được.

... Cập nhật ...

Như Porges chỉ ra trong các ý kiến, thư viện vào liên kết là lỗi thời, nhưng trang đó có một liên kết đến một updated version.

+0

Rất tốt, cảm ơn vì liên kết. –

+0

Đáng chú ý rằng RFC822 là cổ đại, như báo giá xác định. Trong thực tế, RFC mà obsoletes 822 (2822) là * cũng * lỗi thời, trong đó cho bạn thấy làm thế nào out-of-date nó là :) RFC hiện tại cho địa chỉ email là 5322, xuất bản tháng của câu trả lời này! – porges

10

[CẬP NHẬT] Tôi đã đối chiếu mọi thứ tôi biết về xác thực địa chỉ email tại đây: http://isemail.info, hiện không chỉ xác thực mà còn chẩn đoán sự cố với địa chỉ email. Tôi đồng ý với nhiều ý kiến ​​ở đây rằng việc xác thực chỉ là một phần của câu trả lời; xem bài tiểu luận của tôi tại http://isemail.info/about.

Tôi hiện đã đối chiếu các trường hợp kiểm tra từ Cal Henderson, Dave Child, Phil Haack, Doug Lovell và RFC 3696. 158 địa chỉ kiểm tra trong tất cả.

Tôi đã chạy tất cả các thử nghiệm này với tất cả các trình xác thực mà tôi có thể tìm thấy. So sánh ở đây: http://www.dominicsayers.com/isemail

Tôi sẽ cố gắng giữ cho trang này luôn được cập nhật khi mọi người nâng cao trình xác thực của họ. Cảm ơn Cal, Dave và Phil đã giúp đỡ và hợp tác trong việc biên soạn các thử nghiệm này và những lời chỉ trích mang tính xây dựng của my own validator.

Mọi người nên biết về errata against RFC 3696 nói riêng. Ba trong số các ví dụ kinh điển thực tế là địa chỉ không hợp lệ. Và độ dài tối đa của địa chỉ là 254 hoặc 256 ký tự, không phải 320.

+0

Cảm ơn bạn đã thực hiện việc này; thật tuyệt vời khi có dữ liệu thực sự hoạt động, thay vì chỉ là suy đoán. Bạn cũng có thể bao gồm các thư viện khác được đề cập trên trang này không? – Anirvan

Các vấn đề liên quan