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


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.