Який найпростіший регулярний вираз для перевірки електронних листів, щоб не приймати їх наосліп? [зачинено]


80

Коли користувачі створюють обліковий запис на моєму сайті, я хочу зробити перевірку сервера, щоб електронні листи не приймали всі введення.

Я надішлю підтвердження, щоб виконати перевірку рукостискання .

Я шукаю щось просте, не найкраще , але не надто просте, що нічого не підтверджує. Я не знаю, де має бути обмеження, оскільки будь-який регулярний вираз не виконає правильної перевірки, оскільки це неможливо зробити за допомогою регулярних виразів.

Я намагаюся обмежити синтаксис та візуальну складність, властиві регулярним виразам, тому що в цьому випадку будь-яке буде правильним.

Який регулярний вираз я можу використовувати для цього?


Думка "найпростіший" був настільки ж суб'єктивним, як і "найкращий", за інших рівних умов, і ця нитка мала ріг достатку із регулярних виразів, але якщо ви так думаєте ... знизуйте плечима
Міхай Лімбашан

Якщо ви проводите перевірку регулярного виразу, навіщо обмежувати вираз чимось простим? Давайте використаємо щось хороше, це не вплине на ваш код, забезпечуючи кращі результати.
twk

Де у вашій заявці було б це підтвердження? У POST? Що ви робите для дезінфекції вхідних даних?
Браіам

^ (? i) [A-Z0-9 + _.-] + @ (?:. *). (?:. *) $, ^ позначає початок, $ позначає кінець, (? i) збіг регістру. перед @ дозволяти лише буквено-цифрові, '+', '_', '-'. цей,?: для відсутності часткового збігу підгрупи, лише 1 повний матч
P

Відповіді:


99
^\S+@\S+$

3
Це збігатиметься з недійсними адресами. Будь-який регулярний вираз буде, але цей збігатиметься із типовими помилками, такими як test @ stackoverflow..com (зверніть увагу на подвійні крапки.) Надайте кращий приклад.
Mihai Limbășan

62
Це повинен бути максимально простий, дуже грубий фільтр, і я не розумію, чому подвоєні періоди мають пільги над усіма іншими викрутками з подібною складністю, щоб покрити їх.
хаос

2
+1. Це все-таки суб’єктивне питання, і це просто.
Джейсон Коен,

2
Так, якщо ви не хочете використовувати повну перевірку регулярного виразу, це гарне просте наближення
чемпіон

8
+1 Спроба повністю “перевірити” адресу електронної пошти за допомогою регулярного виразу - це дурна домагання. Це працює для виявлення найпростіших помилкових типів; решту можна знайти, спробувавши надіслати пошту. Вищезазначене також дозволяє домени Unicode (-> Punycode), де більшість «розумних» регулярних термінів не справляються з цим.
bobince

239

Можна написати регулярний вираз, який приймає лише адреси електронної пошти, що відповідають стандартам. Однак є деякі адреси електронної пошти, які суворо не відповідають стандартам, але все одно працюють.

Ось кілька простих регулярних виразів для базової перевірки:

Містить символ @:

@

Містить @ і крапку десь після неї:

@.*?\.

Має принаймні один символ перед символом @, перед крапкою та після неї:

.+@.+\..+

Має лише один знак @, принаймні один символ перед символом @, перед крапкою та після неї:

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

Користувач AmoebaMan17 пропонує цю модифікацію для усунення пробілів:

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

А для прийняття лише одного періоду:

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

7
ЯКЩО ви подивитесь на те, що йде по трубі з RFC 6531, і якщо ви уважно подивитесь на RFC 3696, ви, мабуть, прийдете до висновку, що єдиним способом перевірки електронного листа є відправлення листа з підтвердженням. Я думаю, що основна увага при використанні регулярних виразів на адресах електронної пошти повинна бути спрямована на те, щоб допомогти користувачеві запобігти друкарським помилкам, і саме тут в гру вступають такі прості регулярні вирази.
Боб Баркер,

Ідеально, @ AmoebaMan17. RegEx може перевірити формат адреси електронної пошти, не може перевірити вміст адреси електронної пошти. Тим не менш, ваш повністю перевіряє формат. Надсилання електронного листа - це єдиний спосіб перевірити вміст.
Крейг

не буде працювати далі test@test.com?
Абдул Хамід

1
Щоб рядок не закінчувався крапкою, я зробив таку модифікацію: ^ [^ @ \ s] + @ [^ @ \ s] + \. [^ @ \. \ S] + $
fyrite

1
Так, не використовуй останню. Це не відповідає багатьом дійсним параметрам. me@provider.co.uk, наприклад.
s.meijer

7

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

  • Тільки 1 @
  • Кілька доменів і субдоменів

3

Я думаю, що цей невеликий підхід до виразу AmoebaMan17 повинен зупинити адресу, що починається / закінчується крапкою, а також зупиняти кілька крапок поруч. Намагаючись не робити це знову складним, одночасно усуваючи типову проблему.

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

Здається, це працює (але я не RegEx-pert). Виправлено мою проблему, коли користувачі копіювали та вставляли адреси електронної пошти з кінця речень, які закінчуються крапкою.

тобто: ось моя нова електронна адреса tabby@coolforcats.com.


Це не працює для жодного персонажа до @
Andy Hoyle

<script> alert ('привіт') </script> @ hello.com діє відповідно до цього регулярного виразу. Не здається нормально
dudedev

1

Виберіть.

Ось той, який відповідає розділу 3.4.1 RFC 2822 ...

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

Про всяк випадок вам цікаво. :)


7
Просто примітка для тих, хто бачить це зараз: Це не відповідає RFC 2822.
porges

11
І це не просто :)
Dan Diplo

2
Він також заблокує безліч дійсних електронних адрес. Особливо ті, що використовують міжнародні символи / мови.
Боб Баркер,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.