Biểu thức chính quy đơn giản nhất để xác thực email để không chấp nhận chúng một cách mù quáng là gì? [đóng cửa]


80

Khi người dùng tạo tài khoản trên trang web của tôi, tôi muốn xác thực máy chủ để email không chấp nhận mọi đầu vào.

Tôi sẽ gửi một xác nhận, theo một cách để thực hiện xác thực bắt tay .

Tôi đang tìm kiếm một cái gì đó đơn giản, không phải là tốt nhất , nhưng không quá đơn giản mà không xác thực được điều gì. Tôi không biết giới hạn phải ở đâu, vì bất kỳ biểu thức chính quy nào sẽ không thực hiện xác thực chính xác vì không thể thực hiện điều đó với biểu thức chính quy.

Tôi đang cố gắng hạn chế độ phức tạp của sintax và hình ảnh vốn có đối với các biểu thức chính quy, bởi vì trong trường hợp này, bất kỳ biểu thức nào cũng đúng.

Tôi có thể sử dụng regexp nào để làm điều đó?


Suy nghĩ "đơn giản nhất" chính xác là chủ quan như "tốt nhất", ceteris paribus và chủ đề đó có một loạt các regexes, nhưng nếu bạn nghĩ vậy ... nhún vai
Mihai

Nếu bạn thực hiện xác thực regex tại sao lại giới hạn biểu thức thành một thứ đơn giản? Hãy sử dụng thứ gì đó tốt, điều này sẽ không ảnh hưởng đến việc mã của bạn mang lại kết quả tốt hơn.
twk

Việc xác nhận này sẽ ở đâu trong ứng dụng của bạn? Trên bài đăng? Bạn đang làm gì để khử trùng đầu vào?
Braiam

^ (? i) [A-Z0-9 + _.-] + @ (?:. *). (?:. *) $, ^ biểu thị bắt đầu, $ biểu thị kết thúc, (? i) đối sánh không phân biệt chữ hoa chữ thường. trước @ chỉ cho phép chữ và số, '+', '_', '-'. thế này,: không có hình trận đấu nhóm cục bộ, chỉ có 1 trận đấu đầy đủ?
P Satish Patro

Câu trả lời:


99
^\S+@\S+$

3
Điều này sẽ khớp với các địa chỉ không hợp lệ. Bất kỳ regex nào cũng được, nhưng regex này sẽ khớp với các cách viết sai phổ biến như test @ stackoverflow..com (lưu ý dấu chấm kép.) Vui lòng cung cấp một ví dụ rõ hơn.
Mihai Limbășan,

62
Nó được cho là một bộ lọc cực kỳ đơn giản, rất thô và tôi không hiểu tại sao thời gian tăng gấp đôi lại được ưu tiên hơn tất cả các vít khác có chi phí phức tạp tương tự để trang trải chúng.
hỗn loạn

2
+1. Đây là một câu hỏi chủ quan dù sao, và điều này là đơn giản.
Jason Cohen

2
Vâng, nếu bạn không muốn sử dụng regex xác nhận đầy đủ, đây là một tốt xấp xỉ đơn giản
rampion

8
+1 Cố gắng "xác thực" hoàn toàn một địa chỉ e-mail thông qua regex là một việc làm ngu ngốc. Điều này hoạt động để bắt các loại sai đơn giản nhất; phần còn lại có thể được tìm thấy bằng cách thử gửi thư. Ở trên cũng cho phép các miền Unicode (-> Punycode), nơi hầu hết các regex "thông minh" đều không sử dụng được.
bobince

237

Có thể viết một biểu thức chính quy chỉ chấp nhận các địa chỉ email tuân theo các tiêu chuẩn. Tuy nhiên, có một số địa chỉ email không tuân thủ nghiêm ngặt các tiêu chuẩn, nhưng vẫn hoạt động.

Dưới đây là một số biểu thức chính quy đơn giản để xác thực cơ bản:

Chứa ký tự @:

@

Chứa @ và một dấu chấm ở đâu đó sau nó:

@.*?\.

Có ít nhất một ký tự trước dấu @, trước dấu chấm và sau dấu chấm:

.+@.+\..+

Chỉ có một ký tự @, ít nhất một ký tự trước dấu @, trước dấu chấm và sau dấu chấm:

^[^@]+@[^@]+\.[^@]+$

Người dùng AmoebaMan17 đề xuất sửa đổi này để loại bỏ khoảng trắng:

^[^@\s]+@[^@\s]+\.[^@\s]+$

Và chỉ chấp nhận một khoảng thời gian:

^[^@\s]+@[^@\s\.]+\.[^@\.\s]+$

7
NẾU bạn xem xét những gì sắp xảy ra với RFC 6531 và nếu bạn xem xét kỹ RFC 3696, có thể bạn sẽ đi đến kết luận rằng cách duy nhất để xác thực email là gửi email xác nhận. Tôi nghĩ trọng tâm thực sự của việc sử dụng regex trên các địa chỉ email là giúp người dùng ngăn lỗi chính tả và đó là lúc mà các regex đơn giản như thế này phát huy tác dụng.
Bob Barker

Tuyệt vời, @ AmoebaMan17. RegEx có thể xác thực định dạng của địa chỉ email, nó không thể xác thực nội dung của địa chỉ email. Điều đó nói rằng, định dạng của bạn xác thực hoàn toàn. Gửi email là cách duy nhất để xác thực nội dung.
Craig

sẽ không hoạt động test@test.com?
Abdul Hameed,

1
Để ngăn chuỗi kết thúc bằng dấu chấm, tôi đã thực hiện sửa đổi này: ^ [^ @ \ s] + @ [^ @ \ s] + \. [^ @ \. \ S] + $
fyrite

1
Vâng, không sử dụng cái cuối cùng. Nó không phù hợp với nhiều lựa chọn hợp lệ. me@provider.co.uk chẳng hạn.
s.meijer

7

^ [a-zA-Z0-9 _. + -] + @ [a-zA-Z0-9 -] +. [a-zA-Z0-9 -.] + $

  • Chỉ 1 @
  • Một số miền và miền phụ

3

Tôi nghĩ rằng điều chỉnh nhỏ này đối với biểu thức của AmoebaMan17 sẽ ngăn địa chỉ bắt đầu / kết thúc bằng dấu chấm và cũng dừng nhiều dấu chấm bên cạnh nhau. Cố gắng không làm cho nó phức tạp trở lại đồng thời loại bỏ một vấn đề phổ biến.

(?!.*\.\.)(^[^\.][^@\s]+@[^@\s]+\.[^@\s\.]+$)

Có vẻ như nó đang hoạt động (nhưng tôi không phải là RegEx-pert). Khắc phục sự cố của tôi với người dùng sao chép và dán địa chỉ email từ cuối các câu kết thúc bằng dấu chấm.

tức là: Đây là địa chỉ email mới của tôi tabby@coolforcats.com.


Điều này không làm việc cho một nhân vật duy nhất trước khi @
Andy Hoyle

<script> alert ('hello') </script> @ hello.com hợp lệ theo regex này. Có vẻ không ổn.
dudedev

1

Bạn chọn đi.

Đây là cái tuân thủ RFC 2822 Phần 3.4.1 ...

(?:[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])+)\])

Chỉ trong trường hợp bạn tò mò. :)


7
Chỉ là một lưu ý cho bất kỳ ai nhìn thấy điều này ngay bây giờ: Điều đó không tuân thủ RFC 2822.
porges

11
Và nó không phải đơn giản, một trong hai :)
Dan Diplo

2
Nó cũng sẽ chặn một loạt các địa chỉ email hợp lệ. Đặc biệt là những người sử dụng ký tự / ngôn ngữ quốc tế.
Bob Barker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.