2009-12-09 35 views
8

Tôi biết có rất nhiều câu hỏi ở đây về xác thực email và RegEx cụ thể. Tôi muốn biết các phương pháp hay nhất là để xác thực email liên quan đến việc có thủ thuật [email protected] (details here). RegExp hiện tại của tôi để xác nhận JavaScript là như sau, nhưng nó không hỗ trợ thêm + trong tay cầm:Thực tiễn tốt nhất để xác thực địa chỉ email (bao gồm cả + trong địa chỉ gmail)

/^([a-zA-Z0-9_.-])[email protected](([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/ 

Có bất kỳ các dịch vụ khác có hỗ trợ thêm +? Tôi có nên cho phép một số + trong địa chỉ hoặc tôi nên thay đổi RegEx để chỉ cho phép một email có số điện thoại gmail.com hoặc googlemail.com làm miền không? Nếu vậy, RegEx sẽ thay đổi điều gì?

CẬP NHẬT: Cảm ơn mọi người đã chỉ ra rằng + hợp lệ cho mỗi thông số kỹ thuật. Tôi không biết điều đó và bây giờ làm cho tương lai. Đối với những người trong số các bạn nói rằng việc sử dụng RegEx để xác thực nó là xấu, lý do của tôi hoàn toàn dựa trên thiết kế sáng tạo mà tôi đang xây dựng. Thiết kế của khách hàng của chúng tôi đặt một kiểm tra màu xanh lá cây hoặc một X màu đỏ bên cạnh đầu vào địa chỉ email trên mờ của nó. Biểu tượng đó cho biết địa chỉ email hợp lệ của nó có phải vì vậy tôi phải sử dụng một số JS để xác thực nó không.

+2

Đây không phải là một mẹo khi nó là một phần của tiêu chuẩn email. – tloach

+8

Không sử dụng RegEx để xác nhận e-mail, ngoài việc bắt gặp sự mờ ảo rõ ràng. Chỉ cần gửi cho người dùng một tin nhắn e-mail có liên kết 'kích hoạt'. Không có quy trình đánh lừa để kiểm tra e-mail. Ít nhất không có gì phù hợp với một tờ giấy A4, ngay cả khi được in trong một phông chữ nhỏ, nhưng có thể đọc được ;-) (http://www.regular-expressions.info/email.html) – Duroth

+0

@tloach Tôi coi đó là một thủ thuật nếu không phải tất cả các dịch vụ email đều hỗ trợ nó theo cách gửi email đến phần đầu của xử lý trước '+' bất kể phần nào sau '+' - tôi thậm chí không biết nó là một phần của tiêu chuẩn. –

Trả lời

11

+valid character trong địa chỉ email. Việc tên miền không phải là gmail.com hay googlemail.com không phải là gmail.com hoặc googlemail.com

Regexes không thực sự là cách rất tốt để xác thực email, nhưng nếu bạn chỉ muốn sửa đổi regex để xử lý dấu cộng, thay đổi nó như sau:

/^([a-zA-Z0-9_.-\+])[email protected](([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/ 

là một ví dụ về cách regex này không xác nhận đối với spec: email [email protected] là hợp lệ theo nó.

+0

Tôi sẽ tò mò về cách tốt nhất để xử lý xác nhận địa chỉ email là gì. – Zoidberg

+0

Tôi cho rằng anh ta có nghĩa là tốt hơn nên sử dụng một thư viện đã được chứng minh, đã được kiểm tra thay vì lăn regex của riêng bạn. Một ví dụ Java về một thư viện như vậy là Apache Commons. –

+1

Xem http://stackoverflow.com/questions/3232/how-far-should-one-take-e-mail-address-validation –

5

Nếu bạn cần xác thực email qua regexp, sau đó read the standard hoặc ít nhất this article.

Các tiêu chuẩn cho thấy sử dụng regexp này:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

Nếu mà không sợ bạn, nó nên :)

+1

Từ bài viết bạn liên kết tới: "Đừng sao chép một cách mù quáng cụm từ thông dụng từ thư viện trực tuyến hoặc diễn đàn thảo luận". Ngoài ra, regex này _still_ không hoàn toàn xác nhận thông số. –

+0

@Aaron Cảm ơn, điều đó rất đáng sợ. Tôi sẽ giả vờ tôi chưa bao giờ thấy điều đó trước đây - đặc biệt là các nhân vật được mã hóa! –

3

tôi sẽ có xu hướng đi với một cái gì đó dọc theo dòng của /[email protected] . + \ .. +/để kiểm tra các lỗi đơn giản. Sau đó, tôi sẽ gửi một email đến địa chỉ để xác minh rằng nó thực sự tồn tại, vì hầu hết các lỗi chính tả sẽ vẫn dẫn đến các địa chỉ email hợp lệ cú pháp.

2

Thông số kỹ thuật cho phép một số địa chỉ email xấu xí thực sự điên rồ. Tôi thường rất khó chịu bởi các trang web thậm chí còn phàn nàn về các địa chỉ email hợp lệ hoàn toàn bình thường, vì vậy, hãy cố gắng không từ chối các địa chỉ email hợp lệ. Tốt hơn là chấp nhận một số địa chỉ bất hợp pháp hơn là từ chối các địa chỉ pháp lý.

Giống như những người khác đã đề xuất, tôi muốn sử dụng regexp đơn giản như /[email protected]+/ và sau đó gửi email xác minh. Nếu đủ quan trọng để xác thực, điều quan trọng là đủ để xác minh, bởi vì địa chỉ email hợp pháp vẫn có thể thuộc về một người nào đó không phải là khách truy cập của bạn. Hoặc chứa lỗi đánh máy không mong muốn nhưng gây tử vong.

* Chỉnh sửa: đã xóa dấu chấm khỏi phần tên miền của regex, bởi vì [email protected] vẫn là địa chỉ email hợp lệ. Vì vậy, ngay cả xác thực siêu đơn giản của tôi đã từ chối các địa chỉ hợp lệ.Có bất kỳ nhược điểm ở tất cả để chỉ chấp nhận tất cả mọi thứ có chứa một @ với một cái gì đó ở phía trước và phía sau nó?

+2

Không có lý do gì khiến chính phủ Tonga không thể thêm mục nhập 'MX' vào' t' ccTLD, tạo một địa chỉ như 'mcv @ to' một địa chỉ email thực tế, đang hoạt động. Họ đã có một máy chủ web chạy trên 'http: // to' (cho một dịch vụ rút ngắn URI), vì vậy nó chắc chắn không phải là không thực tế. –

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