Питання Як перевірити адресу електронної пошти в JavaScript?


Як можна перевірити електронну адресу в JavaScript?


3259


походження


Хоча це рішення може бути простим, я впевнений, що це одна з тих корисних речей, що люди будуть "Googling" для і заслуговує на власний запис на сайті Якщо тільки Google буде першим місцем для пошуку :) Просто подивіться на дублікати цього закритого кожен якийсь час. - Esteban Küber
Я впевнений, що це одна з тих корисних речей, за якими люди будуть займатися пошуком Google  LOL, по суті, саме так я просто натрапив на це питання! - Peter C
можливий дублікат Який найкращий регулярний вираз для перевірки адрес електронної пошти? - Brad Mace
будь ласка, отримайте це правильно, забагато веб-сайтів не люблять мою адресу електронної пошти "firstName @ secondname.name", не всі домени верхнього рівня закінчують це 2 або 3 літери. - Ian Ringrose
Будь-яка підтримка використання перевірок регулярних виразок для електронних листів на 100% проти. Я втомився сказати, що моя електронна адреса "foo+bar@gmail.com" недійсна. Найкращим варіантом є запит користувача ввести їх електронний лист двічі, і якщо ви ПОВИННІ використовувати перевірку регулярних виразок, тоді повідомте користувачеві, що їх адреса електронної пошти не є дійсною, і запитайте, чи впевнені вони, що вони ввели це правильно Навіть йдіть настільки далеко, щоб вказати, ЧОМУ не перевіряли перевірку регулярного виразу, але не затримуйте їх від подання форми. - Soundfx4


Відповіді:


Використовуючи регулярні вирази ймовірно, найкращий спосіб. Ви можете побачити купу тестів тут (взятий з хром)

function validateEmail(email) {
    var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(String(email).toLowerCase());
}

Ось приклад регулярного викладу, який приймає Unicode:

var re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;

Але майте на увазі, що не слід покладатися тільки на перевірку JavaScript. JavaScript може бути легко відключений. Це також слід перевірити на стороні сервера.

Ось приклад вищезгаданого в дії:

function validateEmail(email) {
  var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  return re.test(email);
}

function validate() {
  var $result = $("#result");
  var email = $("#email").val();
  $result.text("");

  if (validateEmail(email)) {
    $result.text(email + " is valid :)");
    $result.css("color", "green");
  } else {
    $result.text(email + " is not valid :(");
    $result.css("color", "red");
  }
  return false;
}

$("#validate").bind("click", validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>


3795



Цей регулярний вираз усуває дійсні електронні листи, що використовуються в користуванні. Не використовувати. Google для "RFC822" або "RFC2822", щоб отримати правильний регулярний вираз. - Randal Schwartz
@Рандалл: Чи можете ви навести приклад адреси електронної пошти, що це не дозволить? - rossipedia
@GoodPerson Я просто намагався надіслати електронною поштою n @ ai, щоб повідомити йому, що у них є класна електронна адреса. Але, на жаль, Gmail не дозволила мені. Я підозрюю, що у кожного, хто має більші проблеми з спілкуванням з іншими людьми через електронну пошту, ніж тільки ваша система перевірки JavaScript на своєму сайті! Але спасибі за те, що підійшли до виклику. - Ben Roberts
Для всіх людей, коментуючи, що це "досить добре": подивіться, ви просто думаєте про цю проблему неправильно. Все добре. Це вибір, який ви можете зробити для ваших користувачів. Я не злий на цьому. Але, ви знаєте, технічно кажучи, ви демонстративно, доказово неправильно. - Wayne Burkett
Ви не можете підтвердити адреси електронної пошти, періоду. Єдиний, хто може підтвердити адресу електронної пошти, є постачальником електронної адреси. Наприклад, ця відповідь відповідає на ці адреси електронної пошти: %2@gmail.com, "%2"@gmail.com, "a..b"@gmail.com, "a_b"@gmail.com, _@gmail.com, 1@gmail.com , 1_example@something.gmail.com всі дійсні, але Gmail ніколи не допустить жодної з цих адрес електронної пошти. Ви повинні це зробити, прийнявши адресу електронної пошти та надіславши повідомлення електронної пошти на цю електронну адресу, з кодом / посиланням, який користувач має відвідати, щоб підтвердити дійсність. - Kevin Fegan


Просто для повноти тут ви маєте інший регулярний вираз, сумісний із RFC 2822

Офіційний стандарт відомий як 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])+)\])

(...) Ми отримуємо більш практичну реалізацію RFC 2822, якщо ми опускаємо синтаксис за допомогою подвійних лапок і квадратних дужок. Він буде як і раніше відповідати 99,99% всіх адрес електронної пошти в реальному використанні сьогодні.

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

Подальші зміни, які ви могли б зробити, - це дозволити будь-який дволітерний домен верхнього рівня країни коду та лише певні загальні домени верхнього рівня. Цей регулярний вираз фільтрує фіктивні електронні адреси, як-от asdf@adsf.adsf. ви буде потрібно оновити його, додавши нові домени верхнього рівня.

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

Тому навіть за офіційними стандартами все ще існують компроміси. Не слід сліпо копіювати регулярні вирази з онлайн-бібліотек або дискусійних форумів. Завжди перевіряйте їх на власні дані та свої власні програми.

Наголос мій


612



NB: "У реальному користуванні сьогодні"може бути дійсним, коли код був написаний, ще 200x. Код воля ймовірно, залишиться в користуванні за той конкретний рік. (Якщо б я мав компенсацію за кожен механізм, то ніхто ніколи не буде використовувати 4 + -летний TLD, за винятком цих конкретних ", я повинен був виправити, я міг би закутати світовий ринок міді та нікелю;)) - Piskvor
Для практичної реалізації RFC 2822 кінці слід трохи змінити, щоб не допустити розширень домену з одним шаблоном. / [a-z0-9! # $% & '* + \ / =? ^ _{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_{|} ~ -] +) * @ (?: [a-z0-9] (?: [a-z0-9 -] * [a-z0-9])? \.) + [a-z0- 9] [a-z0-9 -] * [a-z0-9] / - will Farrell
Крім того, перша частина повинна бути (?: [A-z зі столицею А, щоб уникнути помилкових негативів, коли користувач капіталізує свою електронну адресу. - Don Rolling
З специфікацією d._.___d@gmail.com не є дійсним електронним листом, але це все одно виявляє, що він правильний - Raptor
@DonRolling Не робіть цього. Це означає не тільки "від A до Z, a до z", це також означає "[\] ^ _` ", оскільки це є між "Z" та "a". Використовуйте \w, або краще, просто наведіть нижню лінію на адресу електронної пошти, перш ніж робити що-небудь з цим, оскільки це є конвенцією. - kirb


Я трохи змінив відповідь Джеймона людям, які хочуть дійсно просту перевірку у формі:

anystring@anystring.anystring

Регулярний вираз:

/\S+@\S+\.\S+/

Приклад функції JavaScript:

function validateEmail(email) 
{
    var re = /\S+@\S+\.\S+/;
    return re.test(email);
}

551



/\S+@\S+\.\S+/.test('name@again@example.com')  true - neoascetic
@неосцетичний Шазам! /[^\s@]+@[^\s@]+\.[^\s@]+/.test('name@again@example.com') // false - n0nag0n
Ви можете реалізувати щось 20x, оскільки це може спричинити проблеми для декількох користувачів і може бути недійсним у майбутньому, або ви можете захопити версію ImmortalFirefly, щоб переконатися, що вони принаймні докладають зусиль для того, щоб вона виглядала реальною. Залежно від вашої заявки, швидше за все, хтось зіткнеться через те, що ви не приймаєте їх нестандартну електронну пошту, а не тим, хто викликає проблеми, ввівши адреси електронної пошти, які насправді не існують (які вони можуть будь-коли робити, ввівши 100% дійсна електронна адреса RFC2822, але використовується незареєстроване ім'я користувача або домен). Привітати! - user83358
@ImmortalFirefly, виділений регулярний вираз дійсно відповідатиме name@again@example.com. Спробуйте вставити свою лінію в консоль JavaScript. Я вважаю, що ваш намір полягав у тому, щоб відповідати лише цілковитому тексту, що вимагатиме початку тексту "^" і закінчення тексту "$" операторів. Той, що я використовую, є /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@again@example.com') - OregonTrail
Люди, будь ласка, припиніть скаржитися на помилкові позитиви? Це простий регулярний вираз для виявлення 95% помилок. Якщо ви хочете використовувати дійсно величезні регулярні вирази і все ще буде далеко не досконалим, дивіться інші відповіді. - André Chalella


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

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


293



-1 чому я хочу провести свій час, перевіряючи адресу електронної пошти, яка навіть не передає контроль за регулярним виразом? - kommradHomer
@PaoloBergantino Я просто не виключаю, що регулярний вираз - це погана ідея і просто здогадатися. Адреса неправильної довідки - недійсна адреса% 100. - kommradHomer
@kommradHomer - адреса "regex invalid" майже завжди є дійсною, тому що будь-який регулярний вираз, який ви використовуєте для підтвердження адреси електронної пошти, майже невиправдано, і буде виключати дійсні адреси електронної пошти. Адреса електронної пошти є name_part@domain_part і практично що завгодно в тому числі ан @, дійсний у назві_частини; Адреса foo@bar@machine.subdomain.example.museum є законним, хоча його слід уникнути як foo\@bar@machine..... Як тільки електронна пошта доходить до домену, наприклад 'example.com' цей домен може маршрутизувати пошту "локально", так що "дивні" імена користувачів та імена хостів можуть існувати. - Stephen P
Другий регулярний вираз у відповіді вояжа в stackoverflow.com/a/1373724/69697 це практично для використання і майже не має помилкових негативів. Я згоден з @kommradHomer тут - чому відправити електронний лист, якщо вам не потрібно? Я можу зрозуміти рефлексивне неприязнь до незрозумілих регулярних виразів і бажання тримати код простим, але це ряд рядків коду, який може заощадити ваш сервер на великій кількості проблем, негайно вирівнюючи елементи, які, безумовно, недійсні. Регулярний вираз самостійно не корисний, але служить гарним доповненням до перевірки сервером. - Ben Regenspan
@dmur Я визнаю, що "майже завжди дійсно", ймовірно, завищує його, але я мав мої (абсолютно правильні та робочі) адреси електронної пошти, які веб-сайти відхиляли занадто часто, просто тому, що у мене є .us домен або тому, що я використовував a + ліворуч від @ - у багатьох місцях виправлено ці кричущі помилки, але локальна частина (зліва від @) може бути нічого хоче власник домену. -> "foo@bar.com"@example.com <- це дійсна електронна адреса. - Stephen P


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

\S+@\S+

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


282



+1, оскільки надсилання електронної пошти та побачення того, що відбувається, є єдиним реальним надійним способом перевірки адреси електронної пошти, тому вам не потрібно робити більше, ніж просто повторюваність. - kommradHomer
Ви все ще можете просте це, але зробите трохи більше, щоб переконатися, що у нього є "." десь після @, за якими слідують лише цифри або цифри, тому такі речі, як я @ тут, me @ here @, і me @ herecom недійсні ... ^ \ S + @ \ S + [\.] [0-9a-z ] + $ - Tim Franklin
Я думаю, що адреси електронної пошти можуть містити пробіли. Це, мабуть, краще використовувати .+@.+ - Sam
/\S+@\S+/.test("áéíóúý@ÁÉÍÓÚÝð")  true - gtournie
@gtournie Ніхто не піклується. Ніхто не збирається ввести це в поле електронної пошти випадково, і це все перевірка на передній панелі полягає в наступному: Заборонено, щоб люди випадково вводять невірну інформацію, таку як їх ім'я, в поле адреси електронної пошти. - meagar♦


Сам HTML5 має перевірку електронної пошти. Якщо ваш браузер підтримує HTML5, ви можете використовувати такий код.

<form><input type="email" placeholder="me@example.com">
    <input type="submit">
</form>

jsFiddle посилання

Від Специфікація HTML5:

А. Дійсна електронна пошта це рядок, який відповідає emailвиробництво наступного ABNF, набір символів, для якого є Unicode.

email   = 1*( atext / "." ) "@" label *( "." label )
label   = let-dig [ [ ldh-str ] let-dig ]  ; limited to a length of 63 characters by RFC 1034 section 3.5
atext   = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >

Ця вимога є а навмисне порушення з RFC 5322, який визначає синтаксис адрес електронної пошти, який одночасно є надто строгим (до символу "@"), занадто розпливчастим (після символу "@") і надто слабким (дозволяючи коментарям, символи пробілу та цитування струни в манери незнайомі більшості користувачів), щоб бути практичним використанням тут.

Наступний JavaScript та Perl-сумісний регулярний вираз - це реалізація вищезгаданого визначення.

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

165



це добре, але проблема з цим полягає в тому, що вона повинна бути всередині form тег і подано a submit вхід, який не всі мають розкіш робити. Також ви не можете створити повідомлення про помилку. - Jason
Я додав відповідь нижче, що звільняє вас від форми та подає. Але так, браузери зазвичай також застосовують лише деякі перевірки правдоподібності, а не повну перевірку RFC 822. - Boldewyn
@ br1: це недійсне просто тому, що не існує домену "a". Що ваша внутрішня мережа має певну рішучість до певного IP? - flying sheep
Тип поля електронної пошти Html5 приймає електронні листи, такі як користувач @ email - Puce
Це не працює в Safari - Mr Wilde


Я вважаю це найкращим рішенням:

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

Він дозволяє використовувати наступні формати:

1. prettyandsimple@example.com
2. very.common@example.com
3. disposable.style.email.with+symbol@example.com
4. other.email-with-dash@example.com
9. #!!%%&'*+-/=?#_`{}|~@example.org
6. "() []:;; @ \\\"! # $% & '* + - / =? ^ _ `() | ~ .a "@ example.org
7. "" @ example.org (пробіл між лапками)
8. üñççððå@example.com (унікальні символи в локальній частині)
9. üñîçøðé@üñîøøé.com (Unicode characters in domain part)
10. Pelé@example.com (латиниця)
11. δοκιμή@παράδειγμα.δοκιμή (грецька мова)
12. 我 买 @ 屋. 香港 (китайська)
13. 甲 斐 @ 黒 川. 日本 (японська)
14. чебурашка@ящик-с-пельсинами.рф (кирилиця)

Це ясно універсальний і дозволяє всім важливим міжнародним персонажам, при цьому продовжуючи застосовувати основний формат anything@anything.anything. Це заблокує простір, які технічно дозволено RFC, але вони настільки рідкісні, що я радий зробити це.


95



Це саме те, що я роблю. Всі ці "складні" відповіді дають проблеми: вони або не дозволяють використовувати ідентифікатор слабкого коду або використовувати фіксований набір TLD або необов'язково обмежувати використання користувачем символів, таких як [@ çμ.ö у своєму електронному префіксі (до @) або доменне ім'я. JavaScript в інтерфейсі (не для використання бекенда використання причини) недостатньо для перевірки з міркувань безпеки. Тож чому не просто допомогти користувачеві запобігти основним помилкам. Основні помилки: забудьте про TLD або користувальницький префікс (до @) або частину домену або містику @ як . (або навпаки). З-за того, що ми повинні бути набагато більш обмеженими на стороні сервера. - Hafenkranich
З деяких непарних причин username@domain.com не працює з цією схемою - einstein
@ einstein Це відповідає вашому прикладу: regex101.com/r/vX2eJ0/1 - Andrew
Згідно з вашим регулярним виразу "_.............. kamal@gmail.com" дійсно, що не повинно бути! - Kamal Nayan
Ось заявлений RegEx з прикладами, якщо ви хочете використовувати цей варіант: regex101.com/r/AzzGQU/2 - ryanm


У сучасних браузерах ви можете побудувати на вершині відповіді @ Sushil з чистим JavaScript і DOM:

function validateEmail(value) {
  var input = document.createElement('input');

  input.type = 'email';
  input.required = true;
  input.value = value;

  return typeof input.checkValidity === 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}

Я склав приклад у скрипці http://jsfiddle.net/boldewyn/2b6d5/. У поєднанні з функцією виявлення та перевіркою голих кісток від Відповідь Squirtle, це звільняє вас від регулярних виразів вбивства і не борк у старих браузерах.


76



Це розумна ідея поставити проблему, але вона не працює, тому що браузери також мають дерьмова перевірку. Наприклад, .@a перевіряється як true у поточних версіях Chrome, Firefox і Safari. - Hank
@HenryJackson На жаль, у цьому випадку так. Це тому, що відповідно до RFC це дійсна адреса електронної пошти (думаю, внутрішні мережі). Браузери отримають гриль, якщо вони перевірятимуть занадто вузько і дадуть хибні негативи. - Boldewyn
Оновлено, щоб містити виявлення функцій та граціозну деградацію, тепер він не розбивається на нових браузерах, але використовує будь-який регулярний вираз, який вам подобається. - Ronny
Красивий розв'язок. На жаль, це тільки для HTML5 +. - Edward Olamisan
Це, безумовно, найкраще рішення оригінального питання. Так, він використовує HTML5, але більшість додатків, які потребують такого рівня точності, безумовно, уже в будь-якому іншому спосіб вже покладаються на HTML5, інакше, це незрозуміло. Неможливо, щоб ми коли-небудь визначили, чи є кореспонденція електронною поштою дійсною, але не дає їм перевірити це в будь-якому випадку, тому ми дійсно не повинні вкладати стільки часу чи зусиль, щоб підтвердити це. Швидка перевірка будь-якого явного синтаксису чи спроби непристойності - це все, що ми повинні витратити. - Woody Payne


JavaScript може відповідати регулярному виразу:

emailAddress.match( / some_regex /);

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

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

63



Здається, вузол не складати цей регулярний вираз - Kato
@ Като: він використовує деякі несумісні розширення, у тому числі (?> щоб зупинити повернення назад і (?<angle><)…(?(angle)>) щоб уникнути надання тривалості |. - Ry-♦