Cara memvalidasi alamat email dalam JavaScript

4379

Apakah ada ekspresi reguler untuk memvalidasi alamat email dalam JavaScript?

pix0r
sumber
60
tolong lakukan ini dengan benar, terlalu banyak situs web yang tidak suka alamat email saya "[email protected]", tidak semua domain tingkat atas mengakhirinya 2 atau 3 huruf.
Ian Ringrose
41
Setiap dukungan untuk penggunaan cek regex untuk e-mail saya 100% menentang. Saya lelah diberi tahu bahwa alamat email saya "[email protected]" tidak valid. Opsi terbaik adalah meminta pengguna untuk mengetikkan email mereka dua kali dan jika Anda HARUS menggunakan pemeriksa regex, maka beri tahu pengguna bahwa alamat email mereka tampaknya tidak valid dan tanyakan apakah mereka yakin mereka mengetiknya. Baik. Bahkan melangkah lebih jauh dengan menunjukkan APA yang tidak memeriksa dalam cek regexp, tetapi JANGAN menghentikan mereka dari mengirimkan formulir.
Soundfx4
17
@ Soundfx4: ini harus jawaban THE, dan diterima seperti itu. Menguji kebenaran alamat adalah hal bodoh yang harus dilakukan - cara terbaik untuk membuat pelanggan frustrasi. Saya meminta alamat untuk diketik dua kali dan mengisyaratkan bahwa ada beberapa masalah yang mungkin terjadi (hilang @, ;comdll.) Dan membiarkan pengguna memperbaikinya jika mereka mau (dan menerima apa pun yang mereka kirimkan kepada saya)
WoJ
4
Saya sangat setuju dengan jawaban yang diberikan oleh WoJ. Format alamat email yang valid terlalu rumit untuk diperiksa dengan ekspresi reguler yang sederhana. Satu-satunya cara untuk memastikan bahwa alamat itu valid adalah dengan mencobanya.
Nicole

Jawaban:

4948

Menggunakan ekspresi reguler mungkin adalah cara terbaik. Anda dapat melihat banyak tes di sini (diambil dari kromium )

function validateEmail(email) {
    const 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());
}

Berikut adalah contoh dari expresi reguler yang menerima unicode:

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

Tetapi perlu diingat bahwa seseorang tidak hanya bergantung pada validasi JavaScript. JavaScript dapat dengan mudah dinonaktifkan. Ini harus divalidasi di sisi server juga.

Berikut ini contoh tindakan di atas:

function validateEmail(email) {
  const 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() {
  const $result = $("#result");
  const 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").on("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>

rnevius
sumber
576
Regex ini menghilangkan email yang valid dan sedang digunakan. Jangan gunakan. Google untuk "RFC822" atau "RFC2822" untuk mendapatkan regex yang tepat.
Randal Schwartz
42
Ini bahkan tidak menerima contoh di RFC 822. Beberapa kasus sederhana tidak cocok dengan \ @ b @ c.com, a(b)@c.com. Lihat RFC untuk lebih lanjut. Berikut adalah regex yang tidak akan menolak alamat yang valid [^ @] + @ [^ @] + \. [^ @] + Dan melindungi dari kesalahan umum.
Vroo
126
@GoodPerson Saya baru saja mencoba mengirim email n @ ai untuk memberitahunya mereka memiliki alamat email yang keren. Namun sayang, gmail tidak akan membiarkan saya. Saya menduga siapa pun yang memiliki masalah lebih besar untuk berkomunikasi dengan orang lain melalui email daripada hanya validasi javascript situs saya! Tetapi terima kasih telah mengatasi tantangan ini.
Ben Roberts
26
Ini adalah solusi yang tampaknya bagus untuk sebagian besar penutur bahasa Inggris asli, tetapi gagal dalam tes Turki (lihat Joel Spolsky). Sebagian besar surat unicode diizinkan, dan misalnya di Argentina, alamat seperti "ñoñó[email protected]" sangat normal. joelonsoftware.com/articles/Unicode.html
oligofren
139
Anda tidak dapat memvalidasi alamat email, titik. Satu-satunya yang dapat memvalidasi alamat email adalah penyedia alamat email tersebut. Misalnya, jawaban ini mengatakan alamat email ini: %[email protected], "%2"@gmail.com, "a..b"@gmail.com, "a_b"@gmail.com, [email protected], [email protected] , [email protected]semuanya valid, tetapi Gmail tidak akan pernah mengizinkan alamat email ini. Anda harus melakukan ini dengan menerima alamat email dan mengirim pesan email ke alamat email itu, dengan kode / tautan yang harus dikunjungi pengguna untuk mengonfirmasi validitas.
Kevin Fegan
830

Saya sedikit mengubah jawaban Jaymon untuk orang-orang yang ingin validasi sangat sederhana dalam bentuk:

anystring@anystring.anystring

Ekspresi reguler:

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

Contoh fungsi JavaScript:

function validateEmail(email) 
    {
        var re = /\S+@\S+\.\S+/;
        return re.test(email);
    }
    
console.log(validateEmail('[email protected]'));

C. Lee
sumber
69
Anda dapat menerapkan sesuatu 20x selama itu dapat menyebabkan masalah bagi beberapa pengguna dan mungkin tidak valid di masa depan, atau Anda dapat mengambil versi ImmortalFirefly untuk memastikan mereka setidaknya berupaya agar terlihat nyata. Bergantung pada aplikasi Anda, kemungkinan besar akan menjumpai seseorang akan marah karena Anda tidak menerima email tidak konvensional mereka, daripada seseorang yang menyebabkan masalah dengan memasukkan alamat email yang tidak benar-benar ada (yang dapat mereka lakukan dengan memasukkan alamat email RFC2822 100% valid tetapi menggunakan nama pengguna atau domain tidak terdaftar). Terpilih!
user83358
82
@ImmortalFirefly, regex yang Anda berikan akan benar-benar cocok name@[email protected]. Coba tempel baris Anda ke konsol JavaScript. Saya yakin niat Anda hanya mencocokkan seluruh teks, yang akan memerlukan awal teks '^' dan operator akhir teks '$'. Yang saya gunakan adalah/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@[email protected]')
OregonTrail
8
Berdasarkan validasi ini, email ini valid: check @ this..com
Ehsan
4
Hm Wikipedia mengatakan itu "[email protected]"@example.comadalah alamat email yang valid. /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('"[email protected]"@example.com') // false. Ups.
Bacon Bits
3
Bukankah ini juga memungkinkan @@@.@? : D
hfossli
763

Hanya untuk kelengkapan, di sini Anda memiliki regex yang kompatibel dengan RFC 2822

Standar resmi dikenal sebagai RFC 2822 . Ini menjelaskan sintaksis yang harus dipatuhi oleh alamat email yang valid. Anda dapat ( tetapi Anda tidak boleh - baca terus ) menerapkannya dengan ekspresi reguler ini:

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

(...) Kami mendapatkan implementasi RFC 2822 yang lebih praktis jika kami menghilangkan sintaks menggunakan tanda kutip ganda dan tanda kurung siku. Masih akan cocok dengan 99,99% dari semua alamat email yang digunakan saat ini.

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

Perubahan lebih lanjut yang dapat Anda lakukan adalah mengizinkan domain tingkat atas kode dua huruf apa saja, dan hanya domain tingkat atas generik tertentu. Regex ini menyaring seperti alamat email dummy[email protected] . Anda perlu memperbaruinya saat domain tingkat atas baru ditambahkan .

[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

Jadi, bahkan ketika mengikuti standar resmi, masih ada trade-off yang harus dilakukan. Jangan membabi buta menyalin ekspresi reguler dari perpustakaan online atau forum diskusi. Selalu mengujinya pada data Anda sendiri dan dengan aplikasi Anda sendiri.

Tekankan milikku

voyager
sumber
84
NB: "Dalam penggunaan aktual hari ini " mungkin valid ketika kode ditulis, kembali 200x. Kode kemungkinan akan tetap digunakan di luar tahun itu. (Jika saya memiliki uang receh untuk setiap "meh, tidak akan ada yang akan menggunakan TLD + 4-buletin kecuali yang spesifik" saya harus memperbaikinya, saya bisa menyudutkan pasar tembaga dan nikel dunia;))
Piskvor meninggalkan gedung
7
Untuk implementasi praktis RFC 2822, ending harus dimodifikasi sedikit untuk mencegah ekstensi domain char tunggal. / [a-z0-9! # $% & '* + \ / =? ^ _ {|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_{|} ~ -] +) * @ (?: [a-z0-9] (?: [a-z0-9 -] * [a-z0-9])? \.) + [a-z0-9] [a-z0-9 -] * [a-z0-9] /
akan Farrell
5
Juga, bagian pertama harus (?: [Az dengan huruf A untuk menghindari negatif palsu ketika pengguna memasukkan alamat email mereka.
Don Rolling
9
@ DonRolling Jangan lakukan itu. Itu tidak hanya berarti "A ke Z, a ke z", itu juga berarti "[\] ^ _` "karena itu berada di antara " Z "dan" a ". Gunakan \w, atau lebih baik, hanya huruf kecil alamat email sebelum melakukan apa pun karena itu konvensi.
kirb
5
"Anda harus memperbaruinya saat domain tingkat atas baru ditambahkan." Nah, sangat banyak untuk itu sekarang - ada lebih dari 1500 TLD yang diakui.
Nathan Osman
377

Wow, ada banyak kerumitan di sini. Jika semua yang ingin Anda lakukan hanyalah menangkap kesalahan sintaksis yang paling jelas, saya akan melakukan sesuatu seperti ini:

^\S+@\S+$

Biasanya menangkap kesalahan paling jelas yang dibuat pengguna dan memastikan bahwa formulir sebagian besar benar, yang merupakan inti dari validasi JavaScript.

Jaymon
sumber
70
+1 sebagai mengirim email dan melihat apa yang terjadi adalah satu-satunya cara pasti untuk memvalidasi alamat email, tidak perlu melakukan lebih dari sekadar kecocokan regex.
kommradHomer
20
Anda masih dapat membuatnya tetap sederhana tetapi melakukan sedikit lebih banyak untuk memastikan ia memiliki "." suatu tempat setelah @ diikuti oleh hanya angka atau digit, jadi hal-hal seperti saya @ sini, saya @ sini @, dan saya @ herecom tidak valid ... ^ \ S + @ \ S + [\.] [0-9a-z ] + $
Tim Franklin
14
Saya pikir alamat email bisa berisi spasi. Mungkin lebih baik menggunakan.+@.+
Sam
11
/\S+@\S+/.test("áéíóúý@ÁÉÍÓÚÝð") true
gtournie
111
@ gtournie Tidak ada yang peduli. Tidak ada yang akan memasukkan itu ke dalam bidang email secara tidak sengaja , dan itu semua validasi front-end adalah untuk: Untuk mencegah orang dari secara tidak sengaja memasukkan sedikit informasi yang salah, seperti nama mereka, di bidang email.
meagar
330

Ada sesuatu yang harus Anda pahami begitu Anda memutuskan untuk menggunakan ekspresi reguler untuk memvalidasi email: Ini mungkin bukan ide yang baik . Setelah Anda sepakat dengan hal itu, ada banyak implementasi di luar sana yang dapat membantu Anda di sana, artikel ini merangkumnya dengan baik.

Singkatnya, bagaimanapun, satu-satunya cara untuk benar-benar yakin bahwa apa yang dimasukkan pengguna sebenarnya adalah email adalah benar-benar mengirim email dan melihat apa yang terjadi. Selain itu semua hanya tebakan.

Paolo Bergantino
sumber
112
-1 mengapa saya ingin menghabiskan waktu untuk memvalidasi alamat email yang bahkan tidak lulus kontrol regex?
kommradHomer
63
@kommradHomer - alamat "regex invalid" hampir selalu valid, karena regex apa pun yang Anda gunakan untuk memvalidasi alamat email hampir pasti salah dan akan mengecualikan alamat email yang valid. Sebuah alamat email adalah name_part@domain_partdan praktis apa pun, termasuk seorang @, berlaku di name_part tersebut; Alamat foo@[email protected]itu sah, meskipun harus diloloskan sebagai foo\@bar@machine..... Setelah email mencapai domain, misalnya 'example.com', domain tersebut dapat merutekan email "secara lokal" sehingga nama pengguna dan nama host "aneh" dapat ada.
Stephen P
6
Regex kedua dalam jawaban voyager di stackoverflow.com/a/1373724/69697 praktis untuk digunakan dan seharusnya hampir tidak memiliki negatif palsu. Saya setuju dengan @kommradHomer di sini - mengapa mengirim email jika Anda tidak perlu? Saya dapat memahami ketidaksukaan refleksif untuk regex yang tidak dapat dipahami dan keinginan untuk menjaga kode tetap sederhana, tetapi ini adalah beberapa baris kode yang dapat menyelamatkan server Anda dari banyak masalah dengan segera mengeluarkan item yang pasti tidak valid. Regex sendiri tidak membantu, tetapi berfungsi sebagai pelengkap yang baik untuk validasi serveride.
Ben Regenspan
6
@dmur saya mengakui "hampir selalu valid" mungkin melebih-lebihkannya, tetapi saya sudah terlalu sering alamat email saya bekerja dengan baik oleh situs web, hanya karena saya memiliki .usdomain atau karena saya menggunakan a +di sebelah kiri the @- banyak tempat telah memperbaiki kesalahan mengerikan ini, tetapi bagian lokal (kiri @) dapat berupa apa saja yang diinginkan pemilik domain. -> "[email protected]"@example.com <- adalah alamat email yang valid.
Stephen P
8
@kommradHomer "Alamat regex-tidak valid adalah% 100 alamat tidak valid." Maafkan saya ... permisi? Apakah Anda tahu sudah berapa kali saya diberi tahu bahwa [email protected] BUKAN email yang valid padahal ternyata BENAR-BENAR BENAR? Logika Anda sangat cacat. Saya telah mengirimkan formulir dengan email sebagai berikut: thisisafakeemailbutitwillpassyourstupidregexcheck@regexchecksareretarded.com Dan coba tebak? YANG LULUS REGEX memeriksa ... tetapi BUKAN email yang valid (meskipun secara teknis IS, tapi saya berjanji itu tidak ada ... belum menggaruk dagunya ) Seperti yang dikatakan banyak orang, IT IS A BAD IDEA ....
Soundfx4
211

HTML5 sendiri memiliki validasi email. Jika browser Anda mendukung HTML5 maka Anda dapat menggunakan kode berikut.

<form><input type="email" placeholder="[email protected]" required>
    <input type="submit">
</form>

tautan jsFiddle

Dari spesifikasi HTML5 :

Sebuah alamat e-mail yang valid adalah string yang cocok dengan emailproduksi ABNF berikut, set karakter yang merupakan 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 >

Persyaratan ini adalah pelanggaran yang disengaja terhadap RFC 5322, yang mendefinisikan sintaks untuk alamat email yang secara bersamaan terlalu ketat (sebelum karakter "@"), terlalu kabur (setelah karakter "@"), dan terlalu longgar (memungkinkan komentar , karakter spasi putih, dan string kutipan dalam perilaku yang tidak dikenal oleh sebagian besar pengguna) agar praktis digunakan di sini.

Ekspresi reguler yang kompatibel dengan JavaScript dan Perl adalah implementasi dari definisi di atas.

/^[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])?)*$/
Anoop
sumber
29
ini bagus, tetapi masalah dengan ini adalah bahwa itu harus di dalam formtag dan diserahkan oleh submitinput, yang tidak semua orang memiliki kemewahan untuk melakukannya. Juga, Anda tidak dapat benar-benar menata pesan kesalahan.
Jason
3
Saya telah menambahkan jawaban di bawah ini yang membebaskan Anda dari formulir dan mengirimkan. Tapi ya, browser biasanya juga hanya menerapkan beberapa pemeriksaan masuk akal dan bukan validasi RFC 822 lengkap.
Boldewyn
8
@ br1: itu tidak valid hanya karena tidak ada "tingkat" domain tingkat atas. apa intranet Anda memiliki tekad untuk beberapa IP?
domba terbang
7
Jenis bidang email Html5 menerima email seperti pengguna @ email
Puce
1
Catatan @ komentar Puce: Input email HTML 5 menerima user@emailsedangkan, sebagai contoh, PHP filter_vartidak. Ini bisa menyebabkan masalah.
texelate
136

Saya menemukan ini sebagai solusi terbaik:

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

Ini memungkinkan format berikut:

1. [email protected]
2. [email protected]
3. [email protected]
4. [email protected]
9. #!$%&'*+-/=?^_`{}|[email protected]
6. "() []:,; @ \\\"! # $% & '* + - / =? ^ _ `{} | ~ .a "@ example.org
7. "" @ example.org (spasi di antara tanda kutip)
8. üñîçøðé@example.com (Karakter Unicode di bagian lokal)
9. üñîçøðé@üñîçøðé.com (Karakter Unicode di bagian domain)
10. Pelé@example.com (Latin)
11. δοκιμή@παράδειγμα.δοκιμή (Yunani)
12. 我 買 @ 屋企. 香港 (Bahasa Cina)
13. 甲 斐 @ 黒 川. 日本 (Jepang)
14. чебурашка@ящик-с-апельсинами.рф (Cyrillic)

Ini jelas serbaguna dan memungkinkan karakter internasional yang sangat penting, sambil tetap menegakkan format dasar [email protected]. Ini akan memblokir ruang yang secara teknis diizinkan oleh RFC, tetapi mereka sangat jarang sehingga saya senang melakukannya.

Andrew
sumber
9
Inilah yang sedang saya lakukan. Semua jawaban "rumit" ini menghasilkan masalah: mereka tidak mengizinkan IDN kode kecil atau menggunakan seperangkat TLD tetap atau tidak perlu membatasi pengguna untuk tidak menggunakan karakter seperti [@ çμ.ö dalam awalan email mereka (sebelum @) atau nama domain. JavaScript di frontend (bukan untuk penggunaan backend) tidak cukup untuk memvalidasi karena alasan keamanan. Jadi mengapa tidak hanya membantu pengguna mencegah kesalahan ketik dasar. Kesalahan ketik dasar adalah: lupakan TLD atau awalan pengguna (sebelum @) atau bagian-domain atau salah ketik @sebagai .(atau sebaliknya). Karena kita harus lebih membatasi pada sisi server.
Hafenkranich
Untuk beberapa alasan aneh [email protected]tidak bekerja dengan pola ini
einstein
2
Menurut regex Anda, "_.............. [email protected]" valid, dan seharusnya tidak!
Kamal Nayan
1
Inilah RegEx yang dinyatakan dengan contoh, jika Anda ingin mengotak-atik solusi ini: regex101.com/r/AzzGQU/2
ryanm
7
Regex ini benar. Jika ada yang memasukkan email mereka, a@b@[email protected][email protected]maka mungkin mereka layak untuk bersenang-senang? : D
corysimmons
94

Di browser modern, Anda dapat membangun di atas jawaban @ Sushil dengan JavaScript murni dan 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);
}

Saya telah mengumpulkan contoh di biola http://jsfiddle.net/boldewyn/2b6d5/ . Dikombinasikan dengan deteksi fitur dan validasi tanpa tulang dari Squirtle's Answer , itu membebaskan Anda dari pembantaian ekspresi reguler dan tidak mengganggu browser lama.

Boldewyn
sumber
4
Ini adalah ide cerdas untuk menyoal masalah tetapi tidak berhasil karena browser juga memiliki validasi jelek. Misalnya .@amemvalidasi seperti truedalam versi Chrome, Firefox, dan Safari saat ini.
Hank
13
@HenryJackson Sayangnya, dalam hal ini ya. Ini karena menurut RFC itu adalah alamat email yang valid (pikirkan intranet). Browser akan dipanggang, jika mereka memvalidasi terlalu sempit dan menghasilkan negatif palsu.
Boldewyn
3
Diperbarui untuk berisi deteksi fitur dan degradasi yang anggun, sekarang tidak merusak browser baru tetapi menggunakan regex yang Anda suka.
Ronny
Solusi yang bagus. Sayangnya ini hanya untuk HTML5 +.
Edward Olamisan
3
Sejauh ini, ini adalah solusi terbaik untuk pertanyaan awal. Ya, ia menggunakan HTML5, tetapi sebagian besar aplikasi yang membutuhkan tingkat akurasi ini sudah pasti akan mengandalkan HTML5 dengan cara lain, jadi titik diperdebatkan. Tidak mungkin bagi kami untuk menentukan apakah email seseorang valid tanpa meminta mereka untuk memverifikasi itu, jadi kami benar-benar tidak perlu menginvestasikan begitu banyak waktu atau upaya untuk memvalidasi itu. Pemeriksaan cepat untuk setiap sintaks yang jelas atau upaya kenakalan adalah semua upaya yang harus kita keluarkan.
Woody Payne
69

Ini adalah versi RFC822 yang benar.

function checkEmail(emailAddress) {
  var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
  var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
  var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  var sQuotedPair = '\\x5c[\\x00-\\x7f]';
  var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
  var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
  var sDomain_ref = sAtom;
  var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
  var sWord = '(' + sAtom + '|' + sQuotedString + ')';
  var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
  var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
  var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
  var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

  var reValidEmail = new RegExp(sValidEmail);

  return reValidEmail.test(emailAddress);
}
bvl
sumber
Alamat IDN tidak divalidasi (info@üpöü.com)
DAH
66

JavaScript dapat mencocokkan ekspresi reguler:

emailAddress.match( / some_regex /);

Berikut ini ekspresi reguler RFC22 untuk email:

^((?>[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)>)$
Ben Scheirman
sumber
1
@ Kato: Ini menggunakan beberapa ekstensi yang tidak kompatibel, termasuk (?>untuk berhenti mundur dan (?<angle><)…(?(angle)>)untuk menghindari memberikan panjang lebar |.
Ry-
60

Semua alamat email berisi simbol 'at' (yaitu @). Uji kondisi yang diperlukan:

email.indexOf("@") > 0

Jangan repot-repot dengan hal yang lebih rumit. Sekalipun Anda dapat dengan sempurna menentukan apakah suatu email adalah RFC-secara sintaksis valid, itu tidak akan memberi tahu Anda apakah itu milik orang yang menyediakannya. Itu yang sangat penting.

Untuk mengujinya, kirim pesan validasi.

Kolonel Panic
sumber
3
bagaimana jika akan ada lebih dari satu simbol '@'? simbol terbatas lainnya? Validasi ini tidak dapat dipercaya ...
eatmypants
56

Validasi yang benar dari alamat email sesuai dengan RFC bukanlah sesuatu yang dapat dicapai dengan ekspresi reguler satu-liner. Artikel dengan solusi terbaik yang saya temukan di PHP adalah Apa alamat email yang valid? . Jelas, itu telah porting ke Jawa. Saya pikir fungsinya terlalu kompleks untuk porting dan digunakan dalam JavaScript. Port JavaScript / node.js: https://www.npmjs.com/package/email-addresses .

Praktik yang baik adalah memvalidasi data Anda di klien, tetapi periksa kembali validasinya di server. Dengan mengingat hal ini, Anda dapat dengan mudah memeriksa apakah suatu string terlihat seperti alamat email yang valid pada klien dan melakukan pemeriksaan ketat pada server.

Inilah fungsi JavaScript yang saya gunakan untuk memeriksa apakah string terlihat seperti alamat email yang valid:

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

Penjelasan:

  • lastAtPos < lastDotPos: Terakhir @harus sebelum terakhir .karena @tidak dapat menjadi bagian dari nama server (sejauh yang saya tahu).

  • lastAtPos > 0: Harus ada sesuatu (nama pengguna email) sebelum yang terakhir @.

  • str.indexOf('@@') == -1: Seharusnya tidak ada @@di alamat. Bahkan jika @muncul sebagai karakter terakhir dalam nama pengguna email, itu harus dikutip sehingga "akan menjadi antara itu @dan yang terakhir @di alamat.

  • lastDotPos > 2: Harus ada setidaknya tiga karakter sebelum titik terakhir, misalnya [email protected].

  • (str.length - lastDotPos) > 2: Seharusnya ada cukup karakter setelah titik terakhir untuk membentuk domain dua karakter. Saya tidak yakin apakah tanda kurung diperlukan.

Milos Rašić
sumber
Fn ini terlihat bagus, tetapi apakah ini lebih baik daripada regex yang ditulis dalam jawaban teratas?
Atul Goyal
4
Aku meragukan itu. Saya menggunakannya hanya untuk memeriksa apakah string terlihat seperti email dan meninggalkan detailnya ke kode sisi server.
Milose Rašic
Ini memvalidasi string apa pun seperti 'aaaa', yaitu tanpa '@' dan '.'
Gennady Shumakher
1
Seharusnya tidak. lastIndexOf () harus mengembalikan -1 jika tidak menemukan jarum.
Miloš Ršic
"Bahkan jika @muncul sebagai karakter terakhir dalam nama pengguna email, itu harus dikutip sehingga "akan menjadi antara itu @dan yang terakhir @di alamat." Bagaimana dengan "@@"@example.com?
Ry-
47

Ini dicuri dari http://codesnippets.joyent.com/posts/show/1917

email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}
Adam McKee
sumber
7
Ini menyaring domain yang selalu populer .museumdan .travel(karena batas 4 char setelah .)
bobobobo
4
Mengubah {2,4} menjadi {2,6} tidak akan menjadi masalah
Anton N
11
@Anton N: Ada sekitar satu trilyun masalah lain juga; final {2,4}hanyalah indikator yang berguna daripadanya (seperti dalam "ketika Anda melihat kesalahan itu, orang lain cenderung ada"). Yang paling mendasar adalah kurangnya +bagian lokal; kotak komentar ini terlalu kecil untuk menunjukkan semua kesalahan yang dilakukan di atas.
Piskvor meninggalkan gedung
37
Mengapa Anda tidak bisa begitu saja melakukannya return filter.test(email.value);?
MT.
3
@AntonN: Sekarang kami memiliki 10+ TLD karakter ( xn--clchc0ea0b2g2a9gcd). Masih tidak masalah?
Piskvor meninggalkan gedung
42

Melakukan hal ini:

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

Mengapa? Ini didasarkan pada RFC 2822 , yang merupakan standar SEMUA alamat email HARUS dipatuhi. Dan saya tidak yakin mengapa Anda akan repot dengan sesuatu yang "lebih sederhana" ... Anda akan menyalin dan menempelkannya;)

Seringkali ketika menyimpan alamat email dalam database saya membuatnya menjadi huruf kecil dan, dalam praktiknya, regexs biasanya dapat ditandai sebagai huruf tidak peka. Dalam kasus ini, ini sedikit lebih pendek:

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

Berikut adalah contoh penggunaannya dalam JavaScript (dengan tanda case case iin the end).

var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
console.log( emailCheck.test('[email protected]') );

Catatan :
Secara teknis beberapa email dapat menyertakan tanda kutip di bagian sebelum @simbol dengan karakter pelarian di dalam tanda kutip (sehingga pengguna email Anda bisa menjengkelkan dan mengandung hal-hal seperti @dan "..."selama itu ditulis dalam tanda kutip). TIDAK ADA YANG PERNAH ADA INI! Sudah usang. Tapi, itu termasuk dalam standar RFC 2822 yang sebenarnya , dan dihilangkan di sini.

Info lebih lanjut: http://www.regular-expressions.info/email.html

Ryan Taylor
sumber
@Kondal kode javascript tidak peka huruf besar-kecil karena /iflag di akhir ekspresi reguler. Saya menyebutkan fakta bahwa itu harus menjadi perbandingan kasus-sensitif, tapi saya akan membuatnya lebih jelas.
Ryan Taylor
Bekerja untuk saya sebagai pesona
Alex
40

Saya sangat menantikan untuk menyelesaikan masalah ini. Jadi saya memodifikasi validasi reguler ekspresi email di atas

  • Asli
    /^(([^<>()\[\]\\.,;:\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,}))$/

  • Diubah
    /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+[^<>()\.,;:\s@\"]{2,})$/

untuk memberikan contoh di Alamat Email Wikipedia .

Dan Anda dapat melihat hasilnya di sini .

masukkan deskripsi gambar di sini

Keith Lee
sumber
Ini sepertinya solusi yang bagus, ia bekerja dengan TLD baru dan juga 1 surat email
Mark Hughes
Kenapa [email protected]tidak benar? Ini kasus sudut yang valid.
Valerio Bozz
24

Anda tidak boleh menggunakan ekspresi reguler untuk memvalidasi string input untuk memeriksa apakah itu email. Ini terlalu rumit dan tidak akan mencakup semua kasus.

Sekarang karena Anda hanya dapat menutupi 90% dari kasing, tulis sesuatu seperti:

function isPossiblyValidEmail(txt) {
   return txt.length > 5 && txt.indexOf('@')>0;
}

Anda bisa memperbaikinya. Misalnya, 'aaa @' valid. Tapi secara keseluruhan Anda mendapatkan intinya. Dan jangan terbawa ... Solusi 90% sederhana lebih baik daripada solusi 100% yang tidak bekerja.

Dunia membutuhkan kode yang lebih sederhana ...

Zo72
sumber
15
Hal ini memungkinkan masuknya begitu banyak alamat email yang tidak valid. Itu adalah saran yang tidak berguna.
cazlab
3
Tidak harus mustahil untuk melakukan debug sama sekali. Ada banyak contoh bagus di utas ini yang memvalidasi lebih jauh dari "apakah ada '@' di dalamnya. Contoh Anda memungkinkan" u @ "dianggap sebagai alamat email yang valid. Setidaknya evaluasi apakah ada domain atau sesuatu yang mungkin sebuah domain. Milik Anda adalah contoh dari apa yang saya sebut "coding malas secara agresif." Saya tidak yakin mengapa Anda mempertahankannya karena sejauh ini merupakan jawaban berperingkat terendah di utas.
cazlab
3
@cazlab mungkin Anda benar. Lagipula saya telah dikalahkan. Berbeda dengan Anda, saya tidak berpikir meskipun salah satu kode di atas menunjukkan mudah untuk men-debug cuplikan. Pendekatan 'malas saya' setidaknya dapat ditingkatkan jika diperlukan.
Zo72
3
Apa bedanya dengan menggunakan regex? (.+)@(.*)melakukan hal yang sama, dan lebih pendek.
snostorm
4
+1 - Jika tujuannya adalah untuk memastikan bahwa pengguna setidaknya telah mencoba memasukkan alamat email, maka memeriksa untuk melihat apakah dapat ditentukan bahwa alamat email itu pasti BUKAN email adalah solusi hebat Contoh yang baik adalah jika Anda ingin nama pengguna seseorang menjadi alamat email. Jika pengguna mengetikkan 'sexy_chick_23', maka regex ini dapat digunakan untuk memberi mereka informasi bahwa email diharapkan. Jika sesuatu yang diketik terlihat seperti email, tetapi tidak, maka pengguna tidak akan pernah mendapatkan email 'konfirmasi' dan proses pendaftaran tidak akan pernah divalidasi.
Chris Dutrow
23

Cukup periksa apakah alamat email yang dimasukkan valid atau tidak menggunakan HTML.

<input type="email"/>

Tidak perlu menulis fungsi untuk validasi.

Pelajar
sumber
4
IE <10 tidak mendukung ini, dan juga browser Android sendiri.
Frank Conijn
7
Upvoting. IE <10 sudah mati.
Michael Scheper
19

Sulit untuk mendapatkan validator email 100% benar. Satu-satunya cara nyata untuk memperbaikinya adalah dengan mengirim email percobaan ke akun. Yang mengatakan, ada beberapa pemeriksaan dasar yang dapat membantu memastikan bahwa Anda mendapatkan sesuatu yang masuk akal.

Beberapa hal untuk ditingkatkan:

Alih-alih baru RegExp, cobalah menulis regexpseperti ini:

if (reg.test(/@/))

Kedua, periksa untuk memastikan bahwa suatu periode muncul setelah @tanda, dan pastikan bahwa ada karakter antara tanda @dan periode.

jacobangel
sumber
19

Inilah cara simpul-validator melakukannya:

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[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]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/
pera
sumber
14

Gunakan kode ini di dalam fungsi validator Anda:

var emailID = document.forms["formName"]["form element id"].value;
atpos = emailID.indexOf("@");
dotpos = emailID.lastIndexOf(".");
if (atpos < 1 || ( dotpos - atpos < 2 ))
{
    alert("Please enter correct email ID")
    return false;
}

Lain Anda bisa menggunakan jQuery . Aturan di dalam mendefinisikan:

eMailId: {
    required: true,
    email: true
}
Anggrek
sumber
1
abc@xyzadalah email yang benar-benar valid yang tidak dikenali oleh regex Anda.
Toto
3
Tidak, bukan itu. Pola email yang benar adalah [email protected], abc @ xyz tidak cocok dengan pola itu. Jadi, ini bukan alamat yang valid.
Anggrek
5
Apakah Anda halaman wikipedia? TLD adalah nama host yang valid. Begitu abc@tldjuga alamat email yang valid.
Toto
2
Satu-satunya cara untuk memvalidasi alamat email adalah dengan mengirim email lalu menunggu tanggapan. Selain itu, berikut ini adalah url tempat Anda dapat menguji apakah alamat Anda memenuhi persyaratan RFC822: mythic-beasts.com/~pdw/cgi-bin/emailvalidate . Anda dapat melihat bahwa abc @ xyz adalah alamat yang valid untuk RFC822.
Toto
14

Pembaruan Regex 2018! coba ini

let val = '[email protected]';
if(/^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val)) {
   console.log('passed');
}

versi naskah lengkap

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val);

info lebih lanjut https://git.io/vhEfc

Juan Pablo
sumber
Ini gagal untuk [email protected] standar
ricks
1
@ Ricks ini tidak benar. Silakan periksa lagi
malimo
13

Solusi yang tidak memeriksa keberadaan TLD tidak lengkap.

Hampir semua jawaban untuk pertanyaan ini menyarankan menggunakan Regex untuk memvalidasi alamat email. Saya pikir Regex hanya baik untuk validasi yang belum sempurna. Tampaknya validasi pengecekan alamat email sebenarnya adalah dua masalah terpisah:

1- Validasi format email: Memastikan apakah email tersebut sesuai dengan format dan pola email di RFC 5322 dan apakah TLD benar-benar ada. Daftar semua TLD yang valid dapat ditemukan di sini .

Misalnya, meskipun alamat [email protected]akan melewati regex, itu bukan email yang valid, karena cccbukan domain tingkat atas oleh IANA.

2- Memastikan email itu benar-benar ada: Untuk melakukan ini, satu-satunya pilihan adalah mengirim email kepada pengguna .

bman
sumber
13

Regex untuk memvalidasi alamat email

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])+
Prabhat Kasera
sumber
Saya tidak melihat regexp Anda di RFC5322: tools.ietf.org/html/rfc5322 - ada beberapa kesalahan?
Kamil Kiełczewski
"Regex terbaik yang pernah ada"? Mungkin semacam penjelasan di sini?
connectyourcharger
Mengapa Anda mengatakan itu adalah solusi terbaik dari semua, dapatkah Anda menjelaskan lebih banyak?
nancoder
Saya tidak dapat mengingat mengapa saya telah menulis "regex terbaik yang pernah ada". Maaf kawan kalau itu mengganggu Anda.
Prabhat Kasera
12

Berikut ini adalah diskusi yang sangat baik tentang penggunaan ekspresi reguler untuk memvalidasi alamat email; " Membandingkan Alamat E-mail yang Memvalidasi Ekspresi Reguler "

Berikut adalah ekspresi teratas saat ini, yaitu JavaScript yang kompatibel, untuk tujuan referensi:

/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i
Eric Schoonover
sumber
9
-1 Daftar putih menyisakan banyak yang diinginkan - terutama, Anda melewatkan .jobs. Selain itu, ada IDN langsung (sebagian besar, saya akui, hanya secara resmi disetujui setelah posting Anda - misalnya .中國pada Juni 2010; tetapi sebagian besar telah bekerja selama bertahun-tahun).
Piskvor meninggalkan gedung
2
-1 tidak menggunakan domain tingkat atas yang konstan. Selalu ada (dan akan ada misalnya 2013) dapat ditambahkan tld baru.
miho
Ada dikonfirmasi 100 untuk TLD baru. Jawaban ini tidak valid dan tidak boleh digunakan.
Dean Meehan
Ya. Saya sudah mengatakannya pada tahun 2011, dan saya akan mengatakannya lagi: daftar putih domain "khusus" hanya akan menjadi lebih buruk seiring berjalannya waktu, karena lebih banyak TLD disetujui. Ada lebih dari 100 TLD yang sepenuhnya valid yang tidak cocok dengan daftar putih di atas: en.wikipedia.org/wiki/List_of_Internet_top-level_domains
Piskvor meninggalkan gedung
Ini tahun 2015. Ekspresi Anda tidak praktis. Anda harus mencatat ini, tetapi Anda mungkin terlalu sibuk memperbaiki semua halaman tempat Anda menaruh ungkapan ini. Baik?
Eric Leroy
12

Ternyata, itu dia:

/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i

Diambil dari http://fightingforalostcause.net/misc/2006/compare-email-regex.php pada 1 Oktober '10.

Tetapi, tentu saja, itu mengabaikan internasionalisasi.

Félix Saparelli
sumber
12

Berbeda dengan squirtle , ini adalah solusi yang rumit, tetapi ia melakukan pekerjaan yang sangat baik untuk memvalidasi email dengan benar:

function isEmail(email) { 
    return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(email);
} 

Gunakan seperti ini:

if (isEmail('[email protected]')){ console.log('This is email is valid'); }
steve
sumber
10
Anda tidak perlu == truepada contoh Anda.
Luke Alderton
11

Pengetahuan saya tentang ekspresi reguler tidak sebaik itu. Itu sebabnya saya memeriksa sintaks umum dengan ekspresi reguler sederhana terlebih dahulu dan memeriksa opsi yang lebih spesifik dengan fungsi lain sesudahnya. Ini mungkin bukan solusi teknis terbaik, tapi dengan cara ini saya lebih fleksibel dan lebih cepat.

Kesalahan paling umum yang saya temui adalah spasi (terutama di awal dan akhir) dan terkadang titik ganda.

function check_email(val){
    if(!val.match(/\S+@\S+\.\S+/)){ // Jaymon's / Squirtle's solution
        // Do something
        return false;
    }
    if( val.indexOf(' ')!=-1 || val.indexOf('..')!=-1){
        // Do something
        return false;
    }
    return true;
}

check_email('check@thiscom'); // Returns false
check_email('[email protected]'); // Returns false
check_email(' [email protected]'); // Returns false
check_email('[email protected]'); // Returns true
Linkmichiel
sumber
10
<form name="validation" onSubmit="return checkbae()">
    Please input a valid email address:<br />

    <input type="text" size=18 name="emailcheck">
    <input type="submit" value="Submit">
</form>

<script language="JavaScript1.2">
    var testresults
    function checkemail(){
        var str = document.validation.emailcheck.value
        var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
        if (filter.test(str))
            testresults = true
        else {
            alert("Please input a valid email address!")
            testresults = false
        }
        return (testresults)
    }
</script>

<script>
    function checkbae(){
        if (document.layers || document.getElementById || document.all)
            return checkemail()
        else
            return true
    }
</script>
Tugrul Asik
sumber
Mungkin jika Anda menambahkan penjelasan atau deskripsi untuk mengikutinya? Saya tidak berpikir Anda benar-benar perlu menunjukkan html; semua orang yang peduli adalah javascript dan regex. Jika Anda mengurangi jawaban Anda hanya dengan jacascript, dan menambahkan sedikit uraian untuk pergi dengannya, saya akan memberi Anda upvote.
bgmCoder
9

Saya sedang mencari Regex di JS yang melewati semua kasus uji Alamat Email:

Di sini kita pergi:

http://regexr.com/3f07j

ATAU regex:

Regex = /(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@[*[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+]*/
Negin
sumber
8

Ekspresi reguler yang disediakan oleh Microsoft dalam ASP.NET MVC adalah

/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/

Yang saya posting di sini kalau-kalau itu cacat - meskipun selalu sempurna untuk kebutuhan saya.

Neil Thompson
sumber
1
Tidak mengizinkan + di bagian nama dari email.
Paul Go