JavaScript'te bir e-posta adresi nasıl doğrulanır?


4374

JavaScript'te bir e-posta adresini doğrulamak için düzenli bir ifade var mı?



60
lütfen bunu doğru yapın, çok fazla web sitesi "firstName@secondName.name" e-posta adresimi beğenmiyor, tüm üst düzey alan adları 2 veya 3 harfle bitmiyor.
Ian Ringrose

41
% 100 karşı olduğum e-postalar için normal ifade kullanımının desteklenmesi. "Foo+bar@gmail.com" e-posta adresimin geçersiz olduğunu söylemekten yoruldum. En iyi seçenek, kullanıcıdan e-postalarını iki kez yazmasını istemek ve bir regex denetleyicisi kullanmanız GEREKİRse, kullanıcıya e-posta adreslerinin geçerli görünmediğini söyleyin ve yazdıklarından emin olup olmadıklarını sorun sağ. Hatta regexp kontrolünde NELERİ kontrol etmediğini, ancak formu göndermelerini DURDURMAYI işaret edecek kadar ileri gidin.
Soundfx4

17
@ Soundfx4: Bu cevap olmalı ve böyle kabul edilmelidir. Bir adresin doğruluğunu test etmek aptalca bir şeydir - müşterileri hayal kırıklığına uğratmanın en iyi yolu. Ben (eksik adres bazı olası sorunlar olduğunu iki kere yazdınız ve ipucu ulaşılmasını isteyen @, ;comvs.) ve isterlerse düzeltmek onları kullanıcıyı izin (ve onlar beni göndermek ne olursa olsun kabul)
woj

4
WoJ tarafından verilen cevaba tamamen katılıyorum. Geçerli bir e-posta adresinin biçimi, basit bir normal ifadeyle kontrol edilemeyecek kadar karmaşıktır. Adresin geçerli olduğundan emin olmanın tek yolu denemektir.
Nicole

Yanıtlar:


4941

Düzenli ifadeler kullanmak muhtemelen en iyi yoldur. Burada bir sürü test görebilirsiniz ( kromdan alınmıştır )

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());
}

Unicode'u kabul eden düzenli ifade örneği:

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

Ancak, yalnızca JavaScript doğrulamasına güvenmemeniz gerektiğini unutmayın. JavaScript kolayca devre dışı bırakılabilir. Bu, sunucu tarafında da doğrulanmalıdır.

İşte yukarıdaki eylemlere bir örnek:

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>


575
Bu normal ifade, kullanımda olan geçerli e-postaları ortadan kaldırır. Kullanmayın. "RFC822" veya "RFC2822" için Google’a uygun bir normal ifade alın.
Randal Schwartz

42
Bu, RFC 822'deki örnekleri bile kabul etmez. Bazı basit durumlar \ @ b @ c.com, a(b)@c.com ile eşleşmez. Daha fazla bilgi için RFC'ye bakın. Geçerli herhangi bir adresi [^ @] + @ [^ @] + \. [^ @] + 'I reddetmeyen ve yaygın hatalara karşı koruyan bir normal ifade.
Vroo

126
@GoodPerson Sadece harika bir e-posta adresine sahip olduklarını söylemek için n @ ai'ye e-posta göndermeye çalıştım. Ama ne yazık ki, Gmail bana izin vermedi. Kim olursa olsun sadece sitemin javascript doğrulamasından daha başkaları ile e-posta yoluyla iletişim sorunları daha şüpheli! Ama meydan okumaya yükseldiğiniz için teşekkürler.
Ben Roberts

26
Bu, anadili İngilizce olanların çoğunda iyi görünen bir çözümdür, ancak Türkiye sınavını geçememektedir (bkz. Joel Spolsky). Çoğu unicode harflere izin verilir ve örneğin Arjantin'de "ñoñó1234@server.com" gibi adresler tamamen normaldir. joelonsoftware.com/articles/Unicode.html
oligofren

139
E-posta adreslerini, dönemi doğrulayamazsınız. Bir e-posta adresini doğrulayabilen tek kişi, e-posta adresinin sağlayıcısıdır. Örneğin, bu yanıt şu e-posta adreslerinin bulunduğunu söylüyor: %2@gmail.com, "%2"@gmail.com, "a..b"@gmail.com, "a_b"@gmail.com, _@gmail.com, 1@gmail.com , 1_example@something.gmail.comhepsi geçerli, ancak Gmail bu e-posta adreslerinden hiçbirine asla izin vermeyecek. Bunu, e-posta adresini kabul ederek ve o e-posta adresine, kullanıcının geçerliliğini doğrulamak için ziyaret etmesi gereken bir kod / bağlantı ile bir e-posta mesajı göndererek yapmalısınız.
Kevin Fegan

829

Şeklinde gerçekten basit doğrulama isteyen insanlar için Jaymon'un cevabını biraz değiştirdim :

anystring@anystring.anystring

Normal ifade:

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

Örnek JavaScript işlevi:

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


69
Birkaç kullanıcı için sorun yaratabilecek ve gelecekte geçerli olmayabilecek 20x uzunluğunda bir şey uygulayabilirsiniz veya ImmortalFirefly'ın sürümünü, en azından gerçek görünmesi için çaba gösterdiklerinden emin olmak için alabilirsiniz. Uygulamanıza bağlı olarak, biriyle karşılaşma olasılığı daha yüksek olabilir, çünkü gerçekten var olmayan e-posta adreslerini girerek sorunlara neden olan (girerek zaten yapabilirler) % 100 geçerli bir RFC2822 e-posta adresi, ancak kayıtlı olmayan bir kullanıcı adı veya alan adı kullanma). Upvoted!
user83358

82
@ImmortalFirefly, sağladığınız normal ifade eşleşir name@again@example.com. Satırınızı bir JavaScript konsoluna yapıştırmayı deneyin. Niyetinizin sadece '^' metninin başlangıcını ve '$' operatörlerinin metninin sonunu gerektirecek tüm metni eşleştirmek olduğuna inanıyorum. Kullandığım/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@again@example.com')
OregonTrail

8
Bu doğrulamaya dayanarak bu e-posta geçerlidir: check @ this..com
Ehsan

4
Hm. Wikipedia bunun "very.unusual.@.unusual.com"@example.comgeçerli bir e-posta adresi olduğunu söylüyor . /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('"very.unusual.@.unusual.com"@example.com') // false. Hata.
Bacon Bits

3
Bu da izin vermiyor @@@.@mu? : D
hfossli

762

Sadece eksiksizlik için, burada başka bir RFC 2822 uyumlu regex var

Resmi standart RFC 2822 olarak bilinir . Geçerli e-posta adreslerinin uyması gereken sözdizimini açıklar. Sen olabilir ( ama olmamalı - okumaya bu düzenli ifade ile bunu uygulamaya):

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

(...) Sözdizimini çift tırnak ve köşeli parantez kullanarak atlarsak, RFC 2822'nin daha pratik bir uygulamasını elde ederiz. Bugün hala kullanılmakta olan tüm e-posta adreslerinin% 99,99'uyla eşleşecektir.

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

Yapabileceğiniz başka bir değişiklik, iki harfli ülke kodu üst düzey alan adına ve yalnızca belirli genel üst düzey alanlara izin vermektir. Bu normal ifade gibi kukla e-posta adreslerini filtrelerasdf@adsf.adsf . Sen yeni üst düzey etki eklendikçe güncellemeniz gerekecektir .

[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

Bu nedenle, resmi standartları takip ederken bile, yapılması gereken değişimler vardır. Çevrimiçi kütüphanelerden veya tartışma forumlarından normal ifadeleri körü körüne kopyalamayın. Bunları her zaman kendi verilerinizde ve kendi uygulamalarınızla test edin.

Vurgu madeni


84
Not: " Bugün gerçek kullanımda " kodu yazıldığında, 200x içinde geçerli olabilir. Kod olacak muhtemelen bu belirli yıldan fazla süre kullanımda kalır. (Eğer her "meh için bir kuruşum olsaydı, kimse düzeltmek zorunda kaldım" o özel olanlar hariç 4 + -terter TLD kullanmaz, dünya bakır ve nikel pazarını köşeye atabilirdim;))
Piskvor binadan ayrıldı

7
RFC 2822'nin pratik uygulaması için, tek karakter alan adı uzantılarını önlemek için sonun biraz değiştirilmesi gerekir. / [a-z0-9! # $% & '* + \ / =? ^ _ {|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_{|} ~ -] +) * @ (?: [a-z0-9] (?: [a-z0-9 -] * [a-z0-9])? \.) + [a-z0-9] [a-z0-9 -] * [a-z0-9] /
Farrell

5
Ayrıca, ilk bölüm (?: [Bir kullanıcı e-posta adresini büyük harfle yazdığında yanlış negatifleri önlemek için A büyük harfli Az olmalıdır.
Don Rolling

9
@DonRolling Bunu yapma. Bu, aynı zamanda aracı "a'dan z'ye, Z bir" sadece anlamına gelmez, "[\] ^ _`" olanlardır, çünkü arasında "Z" ve "a". \wHerhangi bir şey yapmadan önce e-posta adresini kullanın ya da daha iyisi küçüktür, çünkü yine de kongre budur.
kirb

5
"Yeni üst düzey alan adları eklendiğinde bunu güncellemeniz gerekecek." Şimdi bunun için çok fazla - 1500'den fazla tanınmış TLD var.
Nathan Osman

377

Vay be, burada bir sürü karmaşıklık var. Yapmak istediğiniz tek şey en belirgin sözdizimi hatalarını yakalamaksa, böyle bir şey yapardım:

^\S+@\S+$

Genellikle kullanıcının yaptığı en belirgin hataları yakalar ve formun çoğunlukla doğru olduğunu garanti eder, bu da JavaScript doğrulamasının temelini oluşturur.


70
+1, e-posta gönderme ve ne olduğunu görme, bir e-posta adresini doğrulamanın tek gerçek kesin yoludur, basit bir normal ifade eşleşmesinden daha fazlasını yapmaya gerek yoktur.
kommradHomer

20
Yine de basit tutabilirsiniz, ancak bir "." @ 'dan sonra bir yerde sadece rakamlar veya rakamlar gelir, bu yüzden benim gibi @ burada, ben @ burada @ ve ben @ buradakom geçerli değil ... ^ \ S + @ \ S + [\.] [0-9a-z ] + $
Tim Franklin

14
Bence e-posta adreslerinde boşluk olabilir. Muhtemelen kullanmak daha iyidir.+@.+
Sam

11
/\S+@\S+/.test("áéíóúý@ÁÉÍÓÚÝð") true
2014'te gtournie

110
@gtournie Kimse umursamıyor. Kimse bunu bir e-posta alanına yanlışlıkla girmeyecek ve hepsi ön uç doğrulaması: Bir e-posta alanına insanların yanlışlıkla adları gibi yanlış bilgi girmesini önlemek.
meagar

330

E-postaları doğrulamak için normal ifadeyi kullanmaya karar verdiğiniz saniyeyi anlamanız gereken bir şey var: Muhtemelen iyi bir fikir değil . Bunu kabul ettikten sonra, orada yarıya varabilecek birçok uygulama var, bu makale onları güzel bir şekilde özetliyor.

Kısacası, kullanıcının girdiği şeyin aslında bir e-posta olduğundan kesinlikle emin olmanın tek yolu, aslında bir e-posta göndermek ve ne olduğunu görmek. Bunun dışında hepsi sadece tahminler.


112
-1 neden regex kontrolünü bile geçmeyen bir e-posta adresini doğrulayarak zamanımı harcamak isteyeyim?
kommradHomer

63
@kommradHomer - bir "normal ifade geçersiz" adresi neredeyse her zaman geçerlidir, çünkü bir e-posta adresini doğrulamak için kullandığınız normal ifade hemen hemen yanlıştır ve geçerli e-posta adreslerini hariç tutar. Bir e-posta adresi name_part@domain_partve pratik bir şey, dahil bir @, name_part geçerlidir; Adres foo@bar@machine.subdomain.example.museumyasal olarak kullanılsa da adresinden kaçılmalıdır foo\@bar@machine..... E-posta etki alanına ulaştığında, örneğin 'example.com', bu etki alanı postayı "yerel olarak" yönlendirebilir, böylece "garip" kullanıcı adları ve ana makine adları bulunabilir.
Stephen P

6
Voyager'ın stackoverflow.com/a/1373724/69697'deki cevabındaki ikinci normal ifade kullanım için pratiktir ve neredeyse hiç yanlış negatif olmamalıdır. @KommradHomer ile burada hemfikirim - gerekmiyorsa neden e-posta gönderesin? Anlaşılmaz regexes için refleksif sevmediğini anlayabilir ve kodu basit tutma arzusu, ancak bu, kesinlikle geçersiz olan öğeleri hemen ayıklayarak sunucunuzu çok fazla sorundan kurtarabilecek birkaç kod satırı. Bir regex tek başına yararsızdır, ancak sunucu tarafı doğrulaması için iyi bir tamamlayıcıdır.
Ben Regenspan

6
@dmur "hemen hemen her zaman geçerli" olduğunu tahmin ediyorum muhtemelen abartıyor, ancak (mükemmel geçerli ve çalışan) e-posta adreslerim sadece bir alanım olduğu için .usveya +solda bir kullandığım için web siteleri tarafından çok sık reddedildim @- birçok yerde bu korkunç hataları sabit, ama (@ sol) yerel-parçası olabilir şey alan sahibinin istiyor. -> "foo@bar.com"@example.com <- geçerli bir e-posta adresidir.
Stephen P

8
@kommradHomer "Normal ifade geçersiz adresi% 100 geçersiz adres." Üzgünüm, afedersiniz? Gerçekte MÜKEMMEL GEÇERLİDİRKEN kaç kez foo+bar@gmail.com geçerli bir e-posta DEĞİLDİR söylendi biliyor musunuz ?! Mantığınız son derece hatalı. Bu tür e-postaları olan formlar gönderdim: thisisafakeemailbutitwillpassyourstupidregexcheck@regexchecksareretarded.com Ve tahmin et ne oldu? REGEX kontrolünden GEÇİRİLDİ ... ama geçerli bir e-posta DEĞİL (teknik olarak OLMADI, ama varolmadığına söz veriyorum ... ama çenesini çiziyor ). Birçoklarının söylediği gibi, bu kötü bir
fikir

211

HTML5'in kendisinde e-posta doğrulaması vardır. Tarayıcınız HTML5'i destekliyorsa, aşağıdaki kodu kullanabilirsiniz.

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

jsFiddle bağlantısı

Gönderen HTML5 spec :

Bir geçerli bir e-posta adresi ile eşleşen bir dize emailaşağıdaki ABNF üretimini, karakter kümesi Unicode olduğunu.

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 >

Bu gereksinim, aynı anda çok katı ("@" karakterinden önce), çok belirsiz ("@" karakterinden sonra) ve çok gevşek (yorumlara izin veren) e-posta adresleri için bir sözdizimi tanımlayan, RFC 5322'nin kasıtlı bir ihlalidir . , boşluk karakterleri ve alıntılanmış dizeler çoğu kullanıcıya yabancıdır) burada pratik olarak kullanılabilir.

Aşağıdaki JavaScript ve Perl uyumlu düzenli ifade, yukarıdaki tanımın bir uygulamasıdır.

/^[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])?)*$/

29
bu iyi, ama bununla ilgili sorun, bir formetiketin içinde olması ve submitherkesin yapma lüksüne sahip olmayan bir girdi tarafından sunulması gerektiğidir . Ayrıca, hata iletisini gerçekten biçimlendiremezsiniz.
Jason

3
Aşağıya sizi formdan kurtaran ve gönderen bir cevap ekledim. Ancak evet, tarayıcılar genellikle tam bir RFC 822 doğrulaması değil, yalnızca bazı güvenilirlik kontrolü uygular.
Boldewyn

8
@ br1: "a" üst düzey alan olmadığından geçersiz değil. what intranet'iniz bir IP'ye çözüm sağlıyorsa?
uçan koyun

7
Html5 e-posta alan türü user @ email gibi e-postaları kabul eder
Puce

1
Not @ Puce'un yorumu: HTML 5 e-posta girişi kabul user@emailederken, örneğin PHP kabul filter_varetmiyor. Bu sorunlara neden olabilir.
7'de texelate

136

Bunu en iyi çözüm olarak buldum:

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

Aşağıdaki biçimlere izin verir:

1. prettyandsimple@example.com
2. very.common@example.com
3. tek kullanımlık.
4. other.email-with-dash@example.com
9. #!$%&'*+-/=?^_`{ {|~@example.org
6. "() []:,; @ \\\"! # $% & '* + - / =? ^ _ `{} | ~ .A "@ example.org
7. "" @ example.org (tırnak işaretleri arasındaki boşluk)
8. üñîçøðé@example.com (Yerel bölümdeki Unicode karakterler)
9. üñîçøðé@üñîçøðé.com (Alan adı bölümünde Unicode karakterler)
10. Pelé@example.com (Latin)
11. δοκιμή@παράδειγμα.δοκιμή (Yunanca)
12. 我 買 @ 屋企. 香港 (Çince)
13. 甲 斐 @ 黒 川. 日本 (Japonca)
14. чебурашка@ящик-с-апельсинами.рф (Kiril)

Çok yönlüdür ve önemli uluslararası karakterlere izin verirken, temel bir şey@ything.yothing biçimini hala uygular. Teknik olarak RFC tarafından izin verilen alanları engelleyecek, ancak çok nadirdirler, bunu yapmaktan mutluluk duyuyorum.


9
Ben de tam olarak bunu yapıyorum. Tüm bu "karmaşık" yanıtlar sorun yaratır: Ya ID-IDN kodlarına izin vermezler ya da sabit bir TLD seti kullanırlar veya kullanıcıyı e-posta öneklerinde (@ önce) gereksiz yere [@ çµ.ö gibi karakterler kullanmamalıdırlar. veya alan adı. Güvenlik nedeniyle doğrulama için ön uçtaki JavaScript (nedenin arka uç kullanımı için değil) yeterli değildir. Öyleyse neden sadece kullanıcının temel yazım hatalarını önlemesine yardımcı olmuyorsunuz? Temel yazım hatası vardır: TLD'yi yada-öneki (daha önce @) veya alan parçalı ya da yanlış yazdığında unutmak @olarak .(veya tersi). Çünkü sunucu tarafında çok daha kısıtlayıcı olmalıyız.
Hafenkranich

Bazı garip nedenlerden dolayı username@domain.combu modelle çalışmıyor
einstein

2
Normal ifadenize göre "_.............. kamal@gmail.com" geçerlidir, bu olmamalıdır!
Kamal Nayan

1
Bu çözümle uğraşmak
ryanm

7
Bu normal ifade doğrudur. Eğer birisi e-postalarını o a@b@c@d.x.y.@.zzaman giriyorsa, belki de kötü zaman geçirmeyi hak ederler mi? : D
corysimmons

94

Modern tarayıcılarda @ Sushil'in saf JavaScript ve DOM ile cevabının üstüne inşa edebilirsiniz :

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/ kemanına bir örnek koydum . Özellik algılama ve Squirtle's Answer'dan çıplak kemik doğrulaması ile birleştiğinde , sizi normal ifade katliamından kurtarır ve eski tarayıcılarda uğraşmaz.


4
Bu, sorunu çözmek için akıllıca bir fikirdir, ancak tarayıcıların boktan doğrulaması olduğu için işe yaramaz. Örneğin , Chrome, Firefox ve Safari'nin mevcut sürümlerinde .@aolduğu gibi doğrular true.
Hank

13
@HenryJackson Ne yazık ki, bu durumda evet. Bunun nedeni, geçerli bir e-posta adresi olan RFC'ye göre (intranet düşünün). Tarayıcılar çok dar doğrularlar ve yanlış negatifler üretirlerse ızgara olurlardı.
Boldewyn

3
Özellik algılama ve zarif bozulma içerecek şekilde güncellendi, şimdi yeni tarayıcılara zarar vermiyor, ancak istediğiniz herhangi bir normal ifadeyi kullanıyor.
Ronny

Güzel çözüm. Ne yazık ki bu sadece HTML5 + için.
Edward Olamisan

3
Bu, orijinal soru için açık ara en iyi çözümdür. Evet, HTML5 kullanıyor, ancak bu doğruluk düzeyini gerektiren uygulamaların çoğu zaten HTML5'e zaten başka bir şekilde güveniyor olacak, bu yüzden tartışmalı nokta. Birisinin e-postasının, herhangi bir şekilde doğrulamasını sağlamadan geçerli olup olmadığını belirlememiz imkansızdır, bu yüzden gerçekten doğrulamak için çok fazla zaman veya çaba harcamayız. Açık bir sözdizimi veya yaramazlığı denemek için hızlı bir kontrol, harcamamız gereken tüm çabadır.
Woody Payne

69

Bu doğru RFC822 sürümüdür.

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);
}

IDN adresleri doğrulanmadı (info@üpöü.com)
DAH

66

JavaScript normal bir ifadeyle eşleşebilir:

emailAddress.match( / some_regex /);

İşte e-postalar için bir RFC22 düzenli ifadesi:

^((?>[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)>)$

1
@Kato: (?>Geri izlemeyi durdurmak ve (?<angle><)…(?(angle)>)uzun süre sağlamaktan kaçınmak da dahil olmak üzere bazı uyumsuz uzantılar kullanır |.
Ry-

60

Tüm e-posta adreslerinde 'at' (yani @) sembolü bulunur. Gerekli koşulu test edin:

email.indexOf("@") > 0

Daha karmaşık bir şeyle uğraşmayın. Bir e-postanın RFC sözdizimsel olarak geçerli olup olmadığını mükemmel bir şekilde belirleyebilseniz bile, bu e-postanın onu sağlayan kişiye ait olup olmadığını söylemez. Gerçekten önemli olan bu.

Bunu test etmek için bir doğrulama mesajı gönderin.


3
birden fazla '@' sembolü olacaksa ne olur? diğer kısıtlı semboller? Bu doğrulama güvenilemez ...
eatmypants

56

E-posta adresinin RFC'lere uygun olarak doğrulanması, tek satırlık düzenli bir ifade ile gerçekleştirilebilecek bir şey değildir. PHP'de bulduğum en iyi çözümü içeren bir makale Geçerli bir e-posta adresi nedir? . Açıkçası, Java'ya taşındı. Bence bu işlevin JavaScript'te taşınması ve kullanılması çok karmaşık. JavaScript / node.js bağlantı noktası: https://www.npmjs.com/package/email-addresses .

İstemcideki verilerinizi doğrulamak iyi bir yöntemdir, ancak sunucudaki doğrulamayı iki kez kontrol edin. Bunu göz önünde bulundurarak, bir dizenin istemcide geçerli bir e-posta adresi gibi olup olmadığını kontrol edebilir ve sunucuda sıkı bir kontrol gerçekleştirebilirsiniz.

Bir dizenin geçerli bir posta adresi gibi olup olmadığını kontrol etmek için kullandığım JavaScript işlevi:

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);
}

Açıklama:

  • lastAtPos < lastDotPos: Son @son öncesinde olmalıdır .çünkü @sunucu adının bir parçası olamaz (bildiğim kadarıyla).

  • lastAtPos > 0: Sondan önce bir şey (e-posta kullanıcı adı) olmalıdır @.

  • str.indexOf('@@') == -1: Adresinde hayır olmamalıdır @@. Bile @e-posta kullanıcı son karakter olarak göründüğünde, bu alıntı zorundadır böylece "arasındaki olacağını @ve son @adresi.

  • lastDotPos > 2: Örneğin, son noktadan önce en az üç karakter olmalıdır a@b.com.

  • (str.length - lastDotPos) > 2: İki noktadan oluşan bir alan oluşturmak için son noktadan sonra yeterli karakter olmalıdır. Köşeli parantezlerin gerekli olup olmadığından emin değilim.


Bu fn güzel görünüyor, ama üst cevapta yazılan normal ifadeden daha mı iyi?
Atul Goyal

4
Şüpheliyim. Ben sadece bir dize bir e-posta gibi görünüp görünmediğini kontrol etmek ve ayrıntıları sunucu tarafı koda bırakmak için kullanın.
Miloš Rašić

'Aaaa' gibi herhangi bir dizeyi, yani '@' ve 'olmadan doğrular.
Gennady Shumakher

1
Olmamalı. lastIndexOf (), iğneyi bulamazsa -1 döndürmelidir.
Miloš Rašić

“Bile @e-posta kullanıcı son karakter olarak göründüğünü, bu yüzden alıntı zorundadır "arasındaki olacağını @ve son @adresi.” Ne olmuş "@@"@example.com?
Ry-

47

Bu, http://codesnippets.joyent.com/posts/show/1917 adresinden çalındı.

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;}

7
Bu, her zaman popüler olan .museumve .travelalan adlarını filtreliyor (sonraki 4 karakter sınırı nedeniyle .)
bobobobo

4
{2,4} değerini {2,6} olarak değiştirmek sorun olmayacak
Anton N

11
@Anton N: Yaklaşık bir milyarlarca başka sorunu daha var; final {2,4}sadece yararlı bir göstergedir ("bu hatayı gördüğünüzde, başkalarının etrafta olması muhtemeldir" gibi). En temel bir eksikliğidir +yerel parçası; bu yorum kutusu yukarıda belirtilen hataların tümünü gösteremeyecek kadar küçük .
Piskvor

37
Neden sadece yapamıyorsun return filter.test(email.value);?
MT.

3
@AntonN: Şimdi 10'dan fazla karakter TLD ( xn--clchc0ea0b2g2a9gcd) var. Hala sorun değil mi?
Piskvor binadan

42

Bunu yap:

[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])?

Neden? Standart TÜM e-posta adreslerine uyulması GEREKİR RFC 2822'yi temel alır . Ve neden "daha basit" bir şeyle uğraştığınızdan emin değilim ... yine de kopyalayıp yapıştıracaksınız;)

Genellikle e-posta adreslerini veritabanında saklarken küçük harfli hale getiririm ve pratikte normal ifadeler genellikle büyük / küçük harfe duyarsız olarak işaretlenebilir. Bu durumlarda bu biraz daha kısadır:

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

Aşağıda JavaScript'te kullanıldığına ilişkin bir örnek verilmiştir (büyük / küçük harf duyarsız bayrak isonunda).

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('some.body@domain.co.uk') );

Not :
Teknik olarak bazı e-postalar, tırnak içinde @kaçış karakterleri bulunan simgeden önceki bölümde tırnak işareti içerebilir (bu nedenle e-posta kullanıcınız iğrenç olabilir ve tırnak işaretleri içine alındığı sürece @ve "..."gibi şeyler içerebilir ). KİMSE HİÇ BU KADAR! Eski. Ancak, gerçek RFC 2822'ye dahil standardına ve burada atlanır.

Daha fazla bilgi: http://www.regular-expressions.info/email.html


@Kondal javascript kodu, /inormal ifadenin sonundaki bayrak nedeniyle büyük / küçük harfe duyarlı değildir . Büyük / küçük harfe duyarlı olmayan bir karşılaştırma olması gerektiğinden bahsediyorum, ancak bunu daha açık hale getireceğim.
Ryan Taylor

Bir cazibe olarak benim için çalıştı
Alex

40

Gerçekten bu sorunu çözmek için sabırsızlanıyorum. Bu yüzden yukarıdaki e-posta doğrulama normal ifadesini değiştirdim

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

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

e-posta adresindeki örnekleri geçirmek için .

Ve sonucu burada görebilirsiniz .

resim açıklamasını buraya girin


Bu iyi bir çözüm gibi görünüyor, yeni TLD'ler ve 1 harfli e-postalarla da çalışıyor
Mark Hughes

Neden john..doe@example.comdoğru olmasın? Geçerli bir köşe vakası.
Valerio Bozz

24

Giriş dizesini doğrulamak için normal e-posta olup olmadığını kontrol etmek için normal ifadeler kullanmamalısınız. Çok karmaşık ve tüm vakaları kapsamaz.

Şimdi vakaların sadece% 90'ını kapsayabildiğiniz için, şöyle bir şey yazın:

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

Hassaslaştırabilirsiniz. Örneğin, 'aaa @' geçerlidir. Ama genel olarak özü elde edersiniz. Ve taşınmayın ... Basit bir% 90 çözüm, çalışmayan% 100 çözümden daha iyidir.

Dünyanın daha basit bir koda ihtiyacı var ...


15
Bu, çok sayıda geçersiz e-posta adresinin girilmesine izin verir, işe yaramaz tavsiye.
cazlab

3
Hata ayıklamak imkansız olmak zorunda değil. Bu iş parçacığında "içinde bir @ @ var mı?" İfadesinden başka doğrulayan birçok güzel örnek var. Örneğiniz "u @" ifadesinin geçerli bir e-posta adresi olarak kabul edilmesine izin veriyor. Sizinki "agresif tembel kodlama" dediğim şeyin bir örneğidir. Neden parçacığın en düşük puanlı cevabı olduğu için onu savunduğunuzdan emin değilim.
cazlab

3
@cazlab belki haklısın. Sonuçta ben oylandım. Sizden farklı olarak yukarıdaki kodlardan herhangi birinin snippet'lerde hata ayıklamayı kolay göstermesine rağmen sanmıyorum. Gerekirse en azından 'agresif tembel' yaklaşımım geliştirilebilir.
Zo72

3
Bunun regex kullanmaktan farkı nedir? (.+)@(.*)aynı şeyi yapar ve daha kısadır.
snostorm

4
+1 - Amaç, kullanıcının en azından bir e-posta adresi girmeye çalıştığından emin olmaksa, e-posta adresinin kesinlikle E-posta OLMADIĞININ belirlenip belirlenemeyeceğini kontrol etmek harika bir çözüm. Bir kişinin kullanıcı adının e-posta adresi olmasını istiyorsanız buna iyi bir örnek verilebilir. Kullanıcı 'sexy_chick_23' yazarsa, bu normal ifade onlara bir e-postanın beklendiğini bildirmek için kullanılabilir. E-postaya benzeyen ancak yazılmayan bir şey yazılırsa, kullanıcı hiçbir zaman 'onay' e-postasını alamaz ve kayıt işlemi hiçbir zaman doğrulanmaz.
Chris Dutrow

23

Girilen e-posta adresinin geçerli olup olmadığını HTML kullanarak kontrol etmeniz yeterlidir.

<input type="email"/>

Doğrulama için bir işlev yazmaya gerek yoktur.


4
IE <10 bunu desteklemiyor ve Android'in kendi tarayıcısı da desteklemiyor.
Frank Conijn

7
Upvoting. IE <10 öldü.
Michael Scheper

19

% 100 doğru bir e-posta doğrulayıcı almak zor. Bunu düzeltmenin tek gerçek yolu, hesaba bir test e-postası göndermektir. Bununla birlikte, makul bir şey aldığınızdan emin olmanıza yardımcı olabilecek birkaç temel kontrol var.

Geliştirilecek bazı şeyler:

Yeni yerine RegExp, şu şekilde yazmayı deneyin regexp:

if (reg.test(/@/))

İkinci olarak, @işaretten sonra bir nokta geldiğinden emin olun ve @s ile nokta arasında karakterler olduğundan emin olun .


19

Bu nasıl düğüm-doğrulayıcı yapar:

/^(?:[\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])\]))$/

14

Doğrulayıcı işlevinizde bu kodu kullanın:

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;
}

Başka jQuery kullanabilirsiniz . İç kurallar şunları tanımlar:

eMailId: {
    required: true,
    email: true
}

1
abc@xyznormal ifadeniz tarafından tanınmayan, tamamen geçerli bir e-postadır.
Toto

3
Hayır değil. Doğru e-posta modeli bir şeydir. Bir şey. Abc @ xyz bu modelle eşleşmiyor. Yani, geçerli bir adres değil.
Orkide


5
Wikipedia sayfasını ziyaret ettiniz mi? TLD geçerli bir ana bilgisayar adıdır. Yani abc@tldgeçerli bir e-posta adresi.
Toto

2
Bir e-posta adresini doğrulamanın tek yolu bir e-posta göndermek ve ardından yanıt beklemektir. Bunun dışında, adresinizin RFC822 uyumlu olup olmadığını test edebileceğiniz bir url: mythic-beasts.com/~pdw/cgi-bin/emailvalidate . Abc @ xyz'in RFC822 için geçerli bir adres olduğunu görebilirsiniz.
Toto

14

Regex güncelleme 2018! bunu dene

let val = 'email@domain.com';
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');
}

typscript sürümü tamamlandı

//
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);

daha fazla bilgi https://git.io/vhEfc


Standart bir email@domain.com için başarısız Bu
Ricks

1
@RickS bu doğru değil. Lütfen tekrar kontrol edin
malimo

13

TLD'nin varlığını kontrol etmeyen bir çözüm eksik.

Bu soruların hemen hemen tüm yanıtları, e-posta adreslerini doğrulamak için Regex'in kullanılmasını önermektedir. Bence Regex sadece temel bir onay için iyi. Görünüşe göre e-posta adreslerinin doğrulanması iki ayrı sorundur:

1- E-posta biçiminin doğrulanması: E-postanın RFC 5322'deki e-postaların biçimine ve desenine uygun olup olmadığından ve TLD'nin gerçekten var olup olmadığından emin olun. Geçerli tüm TLD'lerin bir listesini burada bulabilirsiniz .

Örneğin, adres example@example.cccnormal ifadeyi geçecek olsa da , geçerli bir e-posta cccdeğildir , çünkü IANA tarafından üst düzey bir alan adı değildir.

2- emin olma eposta gerçekte var: Bu iş için, tek seçenek olan bir e-posta kullanıcıları göndermek .


13

E-posta adresini doğrulamak için normal ifade

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

Normal ifadenizi RFC5322'de görmüyorum: tools.ietf.org/html/rfc5322 - bir hata mı var?
Kamil Kiełczewski

"Şimdiye kadarki en iyi regex"? Muhtemelen burada bir çeşit açıklama var mı?
connectyourcharger

Neden bunun en iyi çözüm olduğunu söylediniz, lütfen biraz daha açıklayabilir misiniz?
nancoder

Neden "şimdiye kadarki en iyi regex" yazdığımı hatırlayamıyorum. Üzgünüm beyler bu seni rahatsız ediyorsa.
Prabhat Kasera

12

İşte e-posta adreslerini doğrulamak için düzenli ifadeler kullanma hakkında çok iyi bir tartışma; " Normal İfadeleri Doğrulama E-posta Adresini Karşılaştırma "

Referans amacıyla şu anki en iyi ifade olan JavaScript uyumludur:

/^[-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

9
-1 Beyaz liste istenecek çok şey bırakıyor - özellikle de kaçırdınız .jobs. Buna ek olarak, canlı IDN'ler var (çoğu, itiraf ediyorum, sadece görevinizden sonra resmi olarak onaylandı - örneğin .中國Haziran 2010'da; ancak çoğu yıllardır çalışmaktadır).
Piskvor

2
-1 sabit üst düzey alanları kullanmaz. Her zaman (ve örneğin 2013 olacak) yeni tld eklenebilir.
miho

Yeni TLD'ler 100'lüdür. Bu cevap geçerli değil ve asla kullanılmamalıdır.
Dean Meehan

Evet. 2011'de söyledim ve tekrar söyleyeceğim: "özel" alanların beyaz listesi, daha fazla TLD onaylandığı için zamanla daha da kötüleşecek. Yukarıdaki beyaz
listeyle

Bu 2015. İfadeniz pratik değil. Bu cevabı indirmelisiniz, ancak muhtemelen bu ifadeyi koyduğunuz tüm sayfaları düzeltmekle çok meşgulsünüz. Sağ?
Eric Leroy


12

Squirtle'ın aksine , burada karmaşık bir çözüm var, ancak e-postaları düzgün bir şekilde doğrulamak için güçlü bir iş yapıyor:

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);
} 

Şöyle kullanın:

if (isEmail('youremail@yourdomain.com')){ console.log('This is email is valid'); }

10
Örneğinizde buna ihtiyacınız yok == true.
Luke Alderton

11

Düzenli ifade bilgim o kadar iyi değil. Bu yüzden genel sözdizimini önce basit bir düzenli ifade ile kontrol ediyorum ve daha sonra diğer fonksiyonlarla daha spesifik seçenekleri kontrol ediyorum. Bu en iyi teknik çözüm olmayabilir, ancak bu şekilde çok daha esnek ve hızlıyım.

Karşılaştığım en yaygın hatalar boşluklar (özellikle başlangıçta ve sonunda) ve bazen çift noktadır.

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('check@this..com'); // Returns false
check_email(' check@this.com'); // Returns false
check_email('check@this.com'); // Returns true

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>

Belki de bir açıklama veya açıklama eklediyseniz? Gerçekten herhangi bir html göstermeniz gerektiğini düşünmüyorum; tüm insanlar endişe javascript ve normal ifade. Cevabınızı sadece jacascript'e indirirseniz ve onunla gitmek için biraz bulanıklaştırırsanız, size bir oy vereceğim.
bgmCoder

9

JS'de tüm e-posta adresi sınama örneklerini geçiren bir Regex arıyordum:

  • email@example.com Geçerli e-posta

  • firstname.lastname@example.com E-posta adres alanında nokta içeriyor

  • email@subdomain.example.com E-postada alt alan adı olan nokta var

  • firstname+lastname@example.com Artı işareti geçerli karakter olarak kabul edilir

  • email@192.0.2.123 Alan adı geçerli bir IP adresidir

  • email@[192.0.2.123] IP adresinin etrafındaki köşeli ayraç geçerli kabul edilir

  • “email”@example.com E-posta ile ilgili teklifler geçerli kabul edilir

  • 1234567890@example.com Adresteki rakamlar geçerlidir

  • email@domain-one.example Alan adındaki kısa çizgi geçerli

  • _______@example.com Adres alanındaki alt çizgi geçerlidir

  • email@example.name .name geçerli Üst Düzey Alan adı

  • email@example.co.jp Üst Düzey Alan adındaki nokta da geçerli sayılır (kullanarak co.jp burada örnek olarak )

  • firstname-lastname@example.com Adres alanındaki tire işareti geçerli

İşte başlıyoruz :

http://regexr.com/3f07j

VEYA normal ifade:

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

8

İçinde Microsoft tarafından sağlanan düzenli ifade ASP.NET MVC olduğunu

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

Hangi kusurlu olması durumunda burada post it - Gerçi her zaman benim ihtiyaçları için mükemmel oldu.


1
+ 'Nın e-postanın ad bölümünde izin vermez.
Paul Go
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.