วิธีตรวจสอบที่อยู่อีเมลใน JavaScript


4374

มีการแสดงออกปกติเพื่อตรวจสอบที่อยู่อีเมลใน JavaScript?



60
โปรดได้รับสิทธินี้เว็บไซต์จำนวนมากเกินไปไม่ชอบที่อยู่อีเมลของฉัน "firstName@secondName.name" ไม่ใช่โดเมนระดับบนสุดที่จะลงท้ายด้วย 2 หรือ 3 ตัวอักษร
Ian Ringrose

41
การสนับสนุนใด ๆ สำหรับการใช้การตรวจสอบ regex สำหรับอีเมลฉันเป็น 100% เทียบกับ ฉันเบื่อที่จะบอกที่อยู่อีเมลของฉันว่า "foo+bar@gmail.com" ไม่ถูกต้อง ตัวเลือกที่ดีที่สุดคือขอให้ผู้ใช้พิมพ์อีเมลสองครั้งและถ้าคุณต้องใช้ตัวตรวจสอบ regex ให้บอกผู้ใช้ว่าที่อยู่อีเมลของพวกเขาดูเหมือนจะไม่ถูกต้องและถามว่าพวกเขาแน่ใจหรือไม่ว่าพิมพ์ ขวา. แม้จะไปไกลถึงจุดที่สิ่งที่ไม่ได้ตรวจสอบในการตรวจสอบ regexp แต่อย่าหยุดพวกเขาจากการส่งแบบฟอร์ม
Soundfx4

17
@ Soundfx4: นี่ควรเป็นคำตอบและยอมรับเช่นนี้ การทดสอบความถูกต้องของที่อยู่เป็นสิ่งที่ต้องทำ - วิธีที่ดีที่สุดในการทำให้ลูกค้าผิดหวัง ผมขออยู่เพื่อจะพิมพ์สองครั้งและคำใบ้ว่ามีปัญหาบางอย่างที่เป็นไปได้ (หายไป@, ;comฯลฯ ) และให้ผู้ใช้แก้ไขให้ถูกต้องหากพวกเขาต้องการ (และยอมรับสิ่งที่พวกเขาส่งฉัน)
WoJ

4
ฉันเห็นด้วยกับคำตอบของ WoJ ทั้งหมด รูปแบบของที่อยู่อีเมลที่ถูกต้องนั้นซับซ้อนเกินกว่าจะตรวจสอบด้วยนิพจน์ทั่วไปอย่างง่าย วิธีเดียวที่จะทำให้แน่ใจว่าที่อยู่นั้นถูกต้องคือลองใช้งาน
นิโคล

คำตอบ:


4942

การใช้นิพจน์ทั่วไปน่าจะเป็นวิธีที่ดีที่สุด คุณสามารถดูการทดสอบมากมายที่นี่ (นำมาจากโครเมียม )

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

นี่คือตัวอย่างของการ expresion ปกติที่ยอมรับ unicode:

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

แต่โปรดจำไว้ว่าเราไม่ควรพึ่งพาการตรวจสอบ JavaScript เท่านั้น สามารถปิดใช้งาน JavaScript ได้อย่างง่ายดาย นี้ควรตรวจสอบด้านเซิร์ฟเวอร์เช่นกัน

นี่คือตัวอย่างของการกระทำข้างต้น:

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
regex นี้จะกำจัดอีเมลที่ถูกต้องและใช้งานไม่ได้ ไม่ได้ใช้. Google สำหรับ "RFC822" หรือ "RFC2822" เพื่อรับ regex ที่เหมาะสม
Randal Schwartz

42
สิ่งนี้ไม่แม้แต่ยอมรับตัวอย่างใน RFC 822 บางกรณีก็ไม่ตรงกับ \ @ b @ c.com, a(b)@c.com ดู RFC สำหรับข้อมูลเพิ่มเติม นี่คือ regex ที่จะไม่ปฏิเสธที่อยู่ที่ถูกต้อง [^ @] + @ [^ @] + \. [^ @] + และป้องกันข้อผิดพลาดทั่วไป
Vroo

126
@GoodPerson ฉันแค่พยายามส่งอีเมล n @ ai เพื่อบอกเขา / เธอพวกเขามีที่อยู่อีเมลที่ยอดเยี่ยม แต่อนิจจา Gmail ไม่ยอมให้ฉัน ฉันสงสัยว่าใครก็ตามที่มีปัญหาในการสื่อสารกับผู้อื่นทางอีเมลมากกว่าการตรวจสอบจาวาสคริปต์ในเว็บไซต์ของฉัน! แต่ต้องขอบคุณสำหรับความท้าทายที่เพิ่มขึ้น
เบ็นโรเบิร์ตส์

26
นี่เป็นวิธีแก้ปัญหาที่ดูดีสำหรับเจ้าของภาษาส่วนใหญ่ แต่ไม่ผ่านการทดสอบภาษาตุรกี (ดู Joel Spolsky) อนุญาตให้ใช้ตัวอักษร unicode ส่วนใหญ่และตัวอย่างเช่นในอาร์เจนตินาที่อยู่เช่น "ñoñó1234@server.com" เป็นเรื่องปกติอย่างสมบูรณ์ joelonsoftware.com/articles/Unicode.html
oligofren

139
คุณไม่สามารถตรวจสอบที่อยู่อีเมลระยะเวลา ผู้เดียวเท่านั้นที่สามารถตรวจสอบที่อยู่อีเมลได้คือผู้ให้บริการของที่อยู่อีเมล ตัวอย่างเช่นคำตอบนี้บอกว่าที่อยู่อีเมลเหล่านี้: %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

829

ฉันได้แก้ไขคำตอบของ Jaymonเล็กน้อยสำหรับผู้ที่ต้องการการตรวจสอบที่ง่ายจริงๆในรูปแบบของ:

anystring@anystring.anystring

การแสดงออกปกติ:

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

ตัวอย่างฟังก์ชัน JavaScript:

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


69
คุณสามารถใช้งานบางสิ่งที่ 20x ซึ่งอาจทำให้เกิดปัญหาสำหรับผู้ใช้บางคนและอาจไม่ถูกต้องในอนาคตหรือคุณสามารถคว้าเวอร์ชันของ ImmortalFirefly เพื่อให้แน่ใจว่าพวกเขาพยายามอย่างน้อยที่จะทำให้มันดูสมจริง ขึ้นอยู่กับแอปพลิเคชันของคุณอาจมีแนวโน้มที่จะเจอใครบางคนที่จะโกรธเพราะคุณไม่ยอมรับอีเมลที่ไม่ธรรมดาของพวกเขาแทนที่จะเป็นคนที่ทำให้เกิดปัญหาโดยการป้อนที่อยู่อีเมลที่ไม่มีอยู่จริง (ซึ่งพวกเขาสามารถทำได้ ที่อยู่อีเมล RFC2822 ที่ถูกต้อง 100% แต่ใช้ชื่อผู้ใช้หรือโดเมนที่ไม่ได้ลงทะเบียน) upvoted!
user83358

82
@ImmortalFirefly, regex ที่คุณระบุจะตรงกับจริงname@again@example.comๆ ลองวางบรรทัดของคุณลงในคอนโซล JavaScript ฉันเชื่อว่าความตั้งใจของคุณคือการจับคู่ข้อความทั้งหมดเท่านั้นซึ่งจะต้องมีจุดเริ่มต้นของข้อความ '^' และตัวดำเนินการสิ้นสุดของข้อความ '$' สิ่งที่ฉันกำลังใช้คือ/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@again@example.com')
OregonTrail

8
จากการตรวจสอบนี้อีเมลนี้ใช้งานได้: ตรวจสอบ @ this..com
Ehsan

4
ฮึ่ม Wikipediaบอกว่า"very.unusual.@.unusual.com"@example.comเป็นที่อยู่อีเมลที่ถูกต้อง /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('"very.unusual.@.unusual.com"@example.com') // false. อุ่ย
เบคอน Bits

3
สิ่งนี้ไม่อนุญาต@@@.@หรือไม่ : D
hfossli

762

เพื่อความสมบูรณ์ที่นี่คุณมี regex ที่สอดคล้องกับ 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])?

การเปลี่ยนแปลงเพิ่มเติมที่คุณสามารถทำได้คืออนุญาตโดเมนระดับบนสุดของรหัสประเทศสองตัวอักษรและเฉพาะโดเมนระดับบนสุดทั่วไปเท่านั้น regex 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

ดังนั้นแม้เมื่อปฏิบัติตามมาตรฐานอย่างเป็นทางการยังคงมีการแลกเปลี่ยนกันอยู่ อย่าคัดลอกนิพจน์ปกติจากห้องสมุดออนไลน์หรือฟอรัมสนทนา ทดสอบกับข้อมูลของคุณเองและแอปพลิเคชันของคุณเอง

เน้นการขุด


84
หมายเหตุ: "ในการใช้งานจริงในวันนี้ " อาจจะถูกต้องเมื่อรหัสถูกเขียนกลับมาเป็น 200x รหัสดังกล่าวจะยังคงใช้งานเกินกว่าปีที่ระบุ (ถ้าฉันมีค่าเล็กน้อยสำหรับ "meh ทุกคนจะไม่ใช้ TLD 4 + -letter ยกเว้นที่เฉพาะเจาะจงเหล่านั้น" ฉันต้องแก้ไขฉันสามารถทำมุมทองแดงและตลาดนิกเกิลของโลก;)
Piskvor ออกจากอาคาร

7
สำหรับการใช้งานจริงของ 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] /
จะแฟร์เรลล์

5
นอกจากนี้ส่วนแรกควรเป็น (?: [Az ที่มีทุน A เพื่อหลีกเลี่ยงการลบที่ผิดพลาดเมื่อผู้ใช้ใช้ที่อยู่อีเมลของพวกเขาเป็นใหญ่
Don Rolling

9
@ DonRolling อย่าทำอย่างนั้น นั่นไม่ได้หมายถึง "A ถึง Z, a ถึง z" แต่ยังหมายถึง "[\] ^ _` "เพราะสิ่งเหล่านั้นอยู่ระหว่าง " Z "และ" a " ใช้\wหรือดีกว่าเพียงพิมพ์ตัวเล็กของที่อยู่อีเมลก่อนที่จะทำอะไรกับมันเพราะนั่นคือการประชุม
kirb

5
"คุณจะต้องอัปเดตเมื่อมีการเพิ่มโดเมนระดับบนสุดใหม่" ดีมากสำหรับตอนนี้ - มี TLD ที่รู้จักมากกว่า 1,500 รายการ
Nathan Osman

377

ว้าวมีความซับซ้อนมากมายที่นี่ หากสิ่งที่คุณต้องการทำเพียงแค่พบข้อผิดพลาดทางไวยากรณ์ที่ชัดเจนที่สุดฉันจะทำสิ่งนี้:

^\S+@\S+$

มันมักจะจับข้อผิดพลาดที่ชัดเจนที่สุดที่ผู้ใช้ทำและยืนยันว่าแบบฟอร์มส่วนใหญ่ถูกต้องซึ่งเป็นสิ่งที่การตรวจสอบ JavaScript เป็นเรื่องเกี่ยวกับ


70
+1 เป็นการส่งอีเมลและดูว่าเกิดอะไรขึ้นเป็นวิธีเดียวที่แท้จริงในการตรวจสอบที่อยู่อีเมลไม่จำเป็นต้องทำอะไรมากกว่าการจับคู่ regex อย่างง่าย
kommradHomer

20
คุณยังสามารถทำให้มันเรียบง่าย แต่ทำอีกเล็กน้อยเพื่อให้แน่ใจว่ามันมี "." บางแห่งหลังจาก @ ตามด้วยตัวเลขหรือตัวเลขเท่านั้นดังนั้นสิ่งต่าง ๆ เช่นฉัน @ ที่นี่ฉัน @ นี่ @ และฉัน @ herecom ไม่ถูกต้อง ... ^ \ S + @ \ S + [\.] [0-9a-z ] + $
Tim Franklin

14
ฉันคิดว่าที่อยู่อีเมลสามารถมีช่องว่าง มันน่าจะดีกว่าที่จะใช้.+@.+
Sam

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

110
@gtournie ไม่มีใครสนใจ ไม่มีใครจะป้อนข้อมูลนั้นลงในช่องอีเมลโดยไม่ได้ตั้งใจและนั่นเป็นการตรวจสอบส่วนหน้าทั้งหมดสำหรับ: เพื่อป้องกันไม่ให้ผู้คนใส่ข้อมูลที่ไม่ถูกต้องเช่นชื่อของพวกเขาในช่องอีเมล
meagar

330

มีบางอย่างที่คุณต้องเข้าใจที่สองคุณตัดสินใจที่จะใช้การแสดงออกปกติไปยังอีเมลตรวจสอบเป็น: มันอาจจะไม่ได้เป็นความคิดที่ดี เมื่อคุณเห็นด้วยกับสิ่งนั้นมีการใช้งานมากมายที่คุณสามารถได้รับครึ่งทางบทความนี้จะสรุปพวกเขาอย่างดี

อย่างไรก็ตามในระยะสั้นวิธีเดียวที่จะมั่นใจได้อย่างแน่นอนในเชิงบวกว่าสิ่งที่ผู้ใช้ป้อนในความเป็นจริงอีเมลคือการส่งอีเมลจริงและดูสิ่งที่เกิดขึ้น นอกจากนั้นมันก็แค่เดา


112
-1 ทำไมฉันต้องการใช้เวลาของฉันในการตรวจสอบที่อยู่อีเมลที่ไม่ผ่านการควบคุม regex
kommradHomer

63
@kommradHomer - ที่อยู่ "ไม่ถูกต้อง regex" นั้นใช้ได้เกือบทุกครั้งเพราะสิ่งใดก็ตามที่คุณใช้ตรวจสอบความถูกต้องของที่อยู่อีเมลนั้นผิดปกติและจะยกเว้นที่อยู่อีเมลที่ถูกต้อง ที่อยู่อีเมลคือname_part@domain_partทุกสิ่งรวมถึงที่@อยู่นั้นถูกต้องใน name_part; ที่อยู่เป็นกฎหมายแม้ว่ามันจะต้องเป็นหนีfoo@bar@machine.subdomain.example.museum foo\@bar@machine....เมื่ออีเมลมาถึงโดเมนเช่น 'example.com' โดเมนนั้นจะสามารถกำหนดเส้นทางจดหมาย "ในพื้นที่" เพื่อให้ชื่อผู้ใช้และชื่อโฮสต์ "แปลก" มีอยู่
สตีเฟ่น P

6
regex ที่สองในคำตอบของนักเดินทางรอบโลกในstackoverflow.com/a/1373724/69697นั้นเป็นประโยชน์สำหรับการใช้งานและไม่ควรมีเชิงลบที่ผิดพลาด ฉันเห็นด้วยกับ @kommradHomer ที่นี่ - ทำไมส่งอีเมลถ้าคุณไม่ต้อง ฉันสามารถเข้าใจ reflexive ไม่ชอบสำหรับ regexes ที่เข้าใจไม่ได้และต้องการให้โค้ดง่าย แต่นี่เป็นโค้ดสองบรรทัดที่สามารถช่วยเซิร์ฟเวอร์ของคุณได้หลายปัญหาด้วยการกำจัดรายการที่ไม่ถูกต้องในทันที regex ด้วยตัวของมันเองนั้นไม่มีประโยชน์ แต่ทำหน้าที่เป็นส่วนเสริมที่ดีในการตรวจสอบความถูกต้องของเซิร์ฟเวอร์
Ben Regenspan

6
@dur ฉันยอมรับว่า "เกือบจะถูกต้องทุกครั้ง" อาจจะเกินเลยไป แต่ฉันมีที่อยู่อีเมล (ถูกต้องสมบูรณ์และใช้งานได้) ที่ถูกปฏิเสธโดยเว็บไซต์บ่อยเกินไปเพียงเพราะฉันมี.usโดเมนหรือเพราะฉันใช้+ทางซ้ายของ@- หลายสถานที่มีการแก้ไขข้อผิดพลาดอย่างมหันต์เหล่านี้ แต่ท้องถิ่นส่วน (ซ้าย @) สามารถเป็นอะไรความต้องการเจ้าของโดเมน -> "foo@bar.com"@example.com <- เป็นที่อยู่อีเมลที่ถูกต้อง
Stephen P

8
@kommradHomer "ที่อยู่ที่ไม่ถูกต้องของ regex คือ% 100 ที่อยู่ที่ไม่ถูกต้อง" ฉันขอโทษ ... ขอโทษที คุณรู้ไหมว่ามีคนบอกฉันกี่ครั้งว่า foo+bar@gmail.com ไม่ใช่อีเมลที่ถูกต้องเมื่อจริง ๆ แล้วมันถูกต้องสมบูรณ์หรือไม่! ตรรกะของคุณมีข้อบกพร่องอย่างมาก ฉันส่งแบบฟอร์มพร้อมอีเมลเช่น: thisisafakeemailbutitwillpassyourstupidregexcheck@regexchecksareretarded.com แล้วเดาว่าไง? นั่นผ่านการตรวจสอบ REGEX ... แต่มันไม่ใช่อีเมลที่ถูกต้อง (แม้ว่าในทางเทคนิคแล้วมันเป็น แต่ฉันสัญญากับคุณว่ามันไม่มีอยู่ ... แต่ก็ทำให้คางของเขามีรอยขีดข่วน ) ดังที่หลายคนกล่าวว่ามันเป็นความคิดที่ไม่ดี ....
Soundfx4

211

HTML5 เองมีการตรวจสอบอีเมล หากเบราว์เซอร์ของคุณรองรับ HTML5 คุณสามารถใช้รหัสต่อไปนี้

<form><input type="email" placeholder="me@example.com" required>
    <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])?)*$/

29
นี่เป็นสิ่งที่ดี แต่ปัญหาของสิ่งนี้คือมันจะต้องอยู่ในformแท็กและส่งโดยsubmitอินพุตซึ่งไม่ใช่ทุกคนที่มีความหรูหราในการทำ นอกจากนี้คุณไม่สามารถสไตล์ข้อความแสดงข้อผิดพลาด
เจสัน

3
ฉันได้เพิ่มคำตอบด้านล่างที่ปลดปล่อยคุณจากแบบฟอร์มและส่ง แต่ใช่เบราว์เซอร์มักจะใช้การตรวจสอบความน่าเชื่อถือบางอย่างเท่านั้นและไม่ใช่การตรวจสอบ RFC 822 แบบเต็ม
Boldewyn

8
@ br1: มันไม่ถูกต้องเพียงเพราะไม่มีโดเมนระดับบนสุด "a" อินทราเน็ตของคุณมี IP แบบไหนที่แก้ไขได้?
แกะบิน

7
ประเภทฟิลด์อีเมล Html5 ยอมรับอีเมลเช่น user @ email
Puce

1
หมายเหตุความคิดเห็นของ @ Puce: การป้อนอีเมล HTML 5 ยอมรับuser@emailในขณะที่ตัวอย่างของ PHP filter_varไม่ สิ่งนี้อาจทำให้เกิดปัญหา
texelate

136

ฉันพบสิ่งนี้เป็นทางออกที่ดีที่สุด:

/^[^\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 (อักขระ Unicode ในส่วนท้องถิ่น)
9. üñîçøðé@üñîçøðé.com (อักขระ Unicode ในส่วนของโดเมน)
10. Pelé@example.com (ละติน)
11. δοκιμή@παράδειγμα.δοκιμή (กรีก)
12. 我買 @ 屋企. 香港 (ภาษาจีน)
13. 甲斐 @ 黒川. 日本 (ภาษาญี่ปุ่น)
14. чебурашка@ящик-с-апельсинами.рф (Cyrillic)

เห็นได้ชัดว่ามีความหลากหลายและช่วยให้ตัวละครนานาชาติที่สำคัญในขณะที่ยังคงบังคับใช้รูปแบบพื้นฐานอะไรก็ได้ @anything.anything มันจะปิดกั้นช่องว่างที่ RFC อนุญาตทางเทคนิค แต่พวกมันหายากมากที่ฉันยินดีที่จะทำเช่นนี้


9
นี่คือสิ่งที่ฉันกำลังทำอยู่ คำตอบ "ซับซ้อน" เหล่านี้ทั้งหมดสร้างปัญหา: พวกเขาไม่อนุญาตให้ใช้รหัส IDN ที่ผิดเพี้ยนหรือใช้ TLD แบบคงที่หรือ จำกัด ผู้ใช้ไม่ให้ใช้อักขระเช่น [@ çµ.ö ในคำนำหน้าอีเมลของพวกเขา (ก่อน @) หรือชื่อโดเมน JavaScript ในส่วนหน้า (ไม่ใช่สำหรับการใช้แบ็กเอนด์ของสาเหตุ) ไม่เพียงพอสำหรับการตรวจสอบเพื่อเหตุผลด้านความปลอดภัย ดังนั้นทำไมไม่เพียง แต่ช่วยให้ผู้ใช้ป้องกันการพิมพ์ผิดขั้นพื้นฐาน ความผิดพลาดพื้นฐานคือ: ลืม TLD หรือคำนำหน้าผู้ใช้ (ก่อน @) หรือส่วนของโดเมนหรือพิมพ์ผิด@เป็น.(หรือกลับกัน) สาเหตุเราต้องเข้มงวดมากขึ้นในฝั่งเซิร์ฟเวอร์
Hafenkranich

ด้วยเหตุผลแปลก ๆ บางอย่างusername@domain.comไม่สามารถใช้งานกับรูปแบบนี้ได้
einstein

2
ตาม regex ของคุณ "_.............. kamal@gmail.com" นั้นถูกต้องซึ่งไม่ควรจะเป็น!
Kamal Nayan

1
นี่คือตัวอย่าง RegEx ที่ระบุด้วยหากคุณต้องการคนจรจัดด้วยวิธีนี้: regex101.com/r/AzzGQU/2
ryanm

7
regex นี้ถูกต้อง หากใครก็ตามที่กำลังเข้าสู่อีเมลของพวกเขาเช่นa@b@c@d.x.y.@.zนั้นบางทีพวกเขาสมควรที่จะมีช่วงเวลาที่ไม่ดี? : D
corysimmons

94

ในเบราว์เซอร์สมัยใหม่คุณสามารถสร้างคำตอบของ @ 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มันจะปลดปล่อยคุณจากการสังหารหมู่ที่แสดงออกเป็นประจำและไม่รบกวนกับเบราว์เซอร์รุ่นเก่า


4
นี่เป็นความคิดที่ฉลาดที่จะถ่อปัญหา แต่มันไม่ได้ผลเพราะเบราว์เซอร์มีการตรวจสอบที่ไม่ดี เช่น.@aตรวจสอบว่าเป็นtrueในเวอร์ชันปัจจุบันของ Chrome, Firefox และ Safari
แฮงค์

13
@HenryJackson น่าเสียดายในกรณีนี้คือใช่ นี่เป็นเพราะตาม RFC นั่นคือที่อยู่อีเมลที่ถูกต้อง (คิดว่าอินทราเน็ต) เบราว์เซอร์จะได้รับการย่างถ้าตรวจสอบว่าแคบเกินไปและสร้างข้อผิดพลาดที่ผิดพลาด
Boldewyn

3
อัปเดตเพื่อให้มีการตรวจจับคุณสมบัติและการลดระดับอย่างนุ่มนวลตอนนี้ไม่ได้ทำลายเบราว์เซอร์ใหม่ แต่ใช้ regex ที่คุณต้องการ
Ronny

ทางออกที่ดี น่าเสียดายที่นี่สำหรับ HTML5 + เท่านั้น
Edward Olamisan

3
นี่คือทางออกที่ดีที่สุดสำหรับคำถามเดิม ใช่มันใช้ HTML5 แต่แอปพลิเคชั่นส่วนใหญ่ที่ต้องการความแม่นยำระดับนี้จะใช้ HTML5 ในทางอื่นอยู่แล้วดังนั้น moot point เป็นไปไม่ได้ที่เราจะตัดสินได้ว่าอีเมลของใครบางคนนั้นถูกต้องหรือไม่โดยไม่ต้องให้พวกเขายืนยันดังนั้นเราจึงไม่ควรลงทุนเวลาหรือความพยายามอย่างมากในการตรวจสอบอีเมล การตรวจสอบอย่างรวดเร็วสำหรับไวยากรณ์ที่ชัดเจนหรือความพยายามที่ไร้สาระคือความพยายามทั้งหมดที่เราควรจะได้รับ
Woody Payne

69

นี่คือรุ่น RFC822 ที่ถูกต้อง

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 ไม่ผ่านการตรวจสอบ (info@üpöü.com)
DAH

66

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)>)$

1
@Kato: มันใช้ส่วนขยายเข้ากันไม่ได้บางอย่างรวมทั้ง(?>จะหยุดย้อนรอยและเพื่อหลีกเลี่ยงการให้บริการที่มีความยาว(?<angle><)…(?(angle)>) |
Ry-

60

ที่อยู่อีเมลทั้งหมดมีสัญลักษณ์ 'at' (ie @) ทดสอบเงื่อนไขที่จำเป็น:

email.indexOf("@") > 0

อย่ากังวลกับสิ่งที่ซับซ้อนกว่านี้ แม้ว่าคุณจะสามารถระบุได้อย่างสมบูรณ์ว่าอีเมลนั้นมีผล RFC-syntactically หรือไม่นั้นจะไม่บอกคุณว่ามันเป็นของผู้ให้บริการหรือไม่ นั่นคือสิ่งที่สำคัญจริงๆ

เพื่อทดสอบว่าส่งข้อความตรวจสอบ


3
เกิดอะไรขึ้นถ้าจะมีสัญลักษณ์ '@' มากกว่าหนึ่งตัว สัญลักษณ์ที่ จำกัด อื่น ๆ ? การตรวจสอบนี้ไม่สามารถเชื่อถือได้ ...
eatmypants

56

การตรวจสอบความถูกต้องของที่อยู่อีเมลตาม RFC ไม่ใช่สิ่งที่สามารถเกิดขึ้นได้ด้วยนิพจน์ทั่วไปแบบซับในหนึ่งบรรทัด บทความที่มีทางออกที่ดีที่สุดที่ฉันพบใน PHP คือที่อยู่อีเมลที่ถูกต้องคืออะไร . เห็นได้ชัดว่ามันได้รับการแจ้งความกับ Java ฉันคิดว่าฟังก์ชั่นนั้นซับซ้อนเกินกว่าที่จะรับส่งและใช้งานใน JavaScript ได้ JavaScript / พอร์ต Node.js: https://www.npmjs.com/package/email-addresses

แนวปฏิบัติที่ดีคือการตรวจสอบความถูกต้องของข้อมูลของคุณบนไคลเอ็นต์ แต่ให้ตรวจสอบความถูกต้องอีกครั้งบนเซิร์ฟเวอร์ เมื่อคำนึงถึงสิ่งนี้คุณสามารถตรวจสอบได้ว่าสตริงดูเหมือนที่อยู่อีเมลที่ถูกต้องบนไคลเอนต์และทำการตรวจสอบอย่างเข้มงวดบนเซิร์ฟเวอร์

นี่คือฟังก์ชัน JavaScript ที่ฉันใช้ตรวจสอบว่าสตริงดูเหมือนที่อยู่อีเมลที่ถูกต้องหรือไม่:

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

คำอธิบาย:

  • lastAtPos < lastDotPos: ครั้งสุดท้าย@ควรอยู่ก่อน.เพราะ@ไม่สามารถเป็นส่วนหนึ่งของชื่อเซิร์ฟเวอร์ (เท่าที่ฉันรู้)

  • lastAtPos > 0: ควรมีบางสิ่ง (ชื่อผู้ใช้อีเมล) ก่อนหน้า@นี้

  • str.indexOf('@@') == -1: ไม่ควรมี@@ที่อยู่ แม้ว่า@จะปรากฏเป็นอักขระตัวสุดท้ายในชื่อผู้ใช้อีเมล แต่ต้องมีการเสนอราคาดังนั้น"จะอยู่ระหว่างตัวอักษร@และตัวสุดท้าย@ในที่อยู่

  • lastDotPos > 2: a@b.comควรจะมีอย่างน้อยสามตัวละครก่อนที่จะจุดสุดท้ายที่ยกตัวอย่างเช่น

  • (str.length - lastDotPos) > 2: ควรมีอักขระมากพอหลังจากจุดสุดท้ายเพื่อสร้างโดเมนสองตัว ฉันไม่แน่ใจว่าจำเป็นต้องใช้วงเล็บหรือไม่


fn นี้ดูดี แต่มันดีกว่า regex ที่เขียนในคำตอบยอดนิยมหรือไม่
Atul Goyal

4
ฉันสงสัยมัน. ฉันใช้เพื่อตรวจสอบว่าสายอักขระมีลักษณะเหมือนอีเมลหรือไม่และเก็บรายละเอียดไว้ในรหัสฝั่งเซิร์ฟเวอร์
MilošRašić

ตรวจสอบความถูกต้องว่าตกลงสตริงใด ๆ เช่น 'aaaa' คือไม่มี '@' และ '
Gennady Shumakher

1
มันไม่ควร lastIndexOf () ควรคืนค่า -1 หากไม่พบเข็ม
MilošRašić

“ แม้ว่า@จะปรากฏเป็นอักขระตัวสุดท้ายในชื่อผู้ใช้อีเมล แต่ต้องมีการเสนอราคาดังนั้น"จะอยู่ระหว่างตัวอักษร@และตัวสุดท้าย@ในที่อยู่” เกี่ยวกับ"@@"@example.comอะไร
Ry-

47

สิ่งนี้ถูกขโมยจาก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;}

7
ซึ่งจะกรองการเคยเป็นที่นิยม.museumและ.travelโดเมน (เนื่องจาก 4 ขีด จำกัด ถ่านหลัง.)
bobobobo

4
การเปลี่ยน {2,4} เป็น {2,6} จะไม่มีปัญหา
Anton N

11
@Anton N: มีปัญหาอื่นอีกประมาณหนึ่งพันล้านล้านด้วยเช่นกัน สุดท้าย{2,4}เป็นเพียงตัวบ่งชี้ที่มีประโยชน์ของมัน (เช่นเดียวกับใน "เมื่อคุณเห็นข้อผิดพลาดอื่น ๆ น่าจะเป็นรอบ") พื้นฐานที่สุดอย่างใดอย่างหนึ่งคือการขาดการ+ในส่วนของท้องถิ่น ช่องแสดงความคิดเห็นนี้เล็กเกินไปที่จะชี้ให้เห็นข้อผิดพลาดทั้งหมดที่กระทำข้างต้น
Piskvor ออกจากอาคารเมื่อ

37
ทำไมคุณทำreturn filter.test(email.value);ไม่ได้เหรอ?
มอนแทนา

3
@AntonN: ตอนนี้เรามีตัวละคร TLD มากกว่า 10 ตัว ( xn--clchc0ea0b2g2a9gcd) ยังไม่เป็นปัญหาใช่ไหม
Piskvor ออกจากอาคาร

42

ทำเช่นนี้:

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

ทำไม? มันขึ้นอยู่กับRFC 2822ซึ่งเป็นที่อยู่อีเมลมาตรฐานทั้งหมดต้องเป็นไปตาม และฉันไม่แน่ใจว่าทำไมคุณถึงต้องใส่ใจกับบางสิ่งที่ "เรียบง่าย" ... คุณจะคัดลอกและวางต่อไป

บ่อยครั้งเมื่อจัดเก็บที่อยู่อีเมลในฐานข้อมูลฉันทำให้ที่นี่เป็นตัวพิมพ์เล็กและในทางปฏิบัติ regexs สามารถทำเครื่องหมายตัวพิมพ์เล็กและตัวพิมพ์เล็กได้ ในกรณีเหล่านี้จะสั้นกว่าเล็กน้อย:

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

นี่คือตัวอย่างของการใช้งานใน JavaScript (ที่มีการตั้งค่าสถานะ insensitive case iในตอนท้าย)

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

หมายเหตุ : ใน
ทางเทคนิคอีเมลบางฉบับสามารถรวมเครื่องหมายคำพูดไว้ในส่วนก่อนที่@สัญลักษณ์นั้นจะมีตัวอักษรยกเว้นในเครื่องหมายคำพูด (เพื่อให้ผู้ใช้อีเมลของคุณน่ารังเกียจและมีเนื้อหาที่ชอบ@และ"..."ตราบเท่าที่เขียนด้วยเครื่องหมายคำพูด) ไม่มีใครทำสิ่งนี้เลย! มันล้าสมัยแล้ว แต่มันรวมอยู่ในมาตรฐานRFC 2822จริงและตัดทิ้งไว้ที่นี่

ข้อมูลเพิ่มเติม: http://www.regular-expressions.info/email.html


@Kondal รหัส javascript ไม่ตรงตามตัวพิมพ์ใหญ่ - เล็กเนื่องจากมีการ/iตั้งค่าสถานะที่ส่วนท้ายของนิพจน์ทั่วไป ฉันพูดถึงความจริงที่ว่ามันต้องมีการเปรียบเทียบแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่ฉันจะทำให้ชัดเจนยิ่งขึ้น
Ryan Taylor

ทำงานเพื่อฉันในฐานะเสน่ห์
อเล็กซ์

40

ฉันรอคอยจริงๆที่จะแก้ปัญหานี้ ดังนั้นฉันจึงปรับเปลี่ยนการตรวจสอบอีเมลปกติแสดงออกด้านบน

  • เป็นต้นฉบับ
    /^(([^<>()\[\]\\.,;:\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,}))$/

  • ดัดแปลง
    /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+[^<>()\.,;:\s@\"]{2,})$/

ที่จะผ่านตัวอย่างในวิกิพีเดียที่อยู่อีเมล

และคุณสามารถเห็นผลในที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


ดูเหมือนว่าเป็นโซลูชันที่ดีใช้งานได้กับ TLD ใหม่และอีเมล 1 ฉบับด้วย
Mark Hughes

ทำไมjohn..doe@example.comไม่ถูกต้อง? มันเป็นกรณีมุมที่ถูกต้อง
Valerio Bozz

24

คุณไม่ควรใช้นิพจน์ทั่วไปเพื่อตรวจสอบความถูกต้องของสตริงอินพุตเพื่อตรวจสอบว่าเป็นอีเมลหรือไม่ มันซับซ้อนเกินไปและจะไม่ครอบคลุมทุกกรณี

ขณะนี้เนื่องจากคุณสามารถครอบคลุมเฉพาะ 90% ของกรณีเขียนสิ่งที่ชอบ:

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

คุณสามารถปรับแต่งได้ ตัวอย่างเช่น 'aaa @' ถูกต้อง แต่โดยรวมแล้วคุณจะได้รับส่วนสำคัญ และอย่าหลงทาง ... โซลูชัน 90% แบบง่ายดีกว่าโซลูชัน 100% ที่ใช้งานไม่ได้

โลกต้องการรหัสที่ง่ายกว่า ...


15
วิธีนี้ช่วยให้การป้อนที่อยู่อีเมลที่ไม่ถูกต้องจำนวนมากเป็นคำแนะนำที่ไร้ประโยชน์
cazlab

3
ไม่จำเป็นต้องเป็นข้อแก้ตัวที่เป็นไปไม่ได้เลย มีตัวอย่างที่ดีมากมายในชุดข้อความนี้ที่ตรวจสอบได้ไกลกว่า "มี" @ "อยู่หรือไม่ตัวอย่างของคุณอนุญาตให้" u @ "ถือเป็นที่อยู่อีเมลที่ถูกต้องอย่างน้อยประเมินว่ามีโดเมนหรือบางสิ่งที่ อาจเป็นโดเมนของคุณเป็นตัวอย่างของสิ่งที่ฉันเรียกว่า "การเข้ารหัสแบบขี้เกียจเลยเถิด" ฉันไม่แน่ใจว่าทำไมคุณถึงปกป้องมันเพราะมันเป็นคำตอบที่ได้คะแนนต่ำสุดในหัวข้อนี้
cazlab

3
@cazlab บางทีคุณพูดถูก หลังจากทั้งหมดฉันได้รับการลงคะแนน แตกต่างจากคุณฉันไม่คิดว่ารหัสใด ๆ ข้างต้นแสดงตัวอย่างข้อมูลที่ง่ายต่อการดีบัก อย่างน้อยฉันก็สามารถปรับปรุงวิธีการ 'ก้าวร้าวขี้เกียจ' ได้ถ้าต้องการ
Zo72

3
สิ่งนี้แตกต่างจากการใช้ regex อย่างไร (.+)@(.*)ทำสิ่งเดียวกันและสั้นกว่า
snostorm

4
+1 - หากวัตถุประสงค์คือเพื่อให้แน่ใจว่าผู้ใช้พยายามใส่ที่อยู่อีเมลอย่างน้อยที่สุดจากนั้นตรวจสอบเพื่อดูว่าสามารถระบุได้ว่าที่อยู่อีเมลนั้นไม่ใช่อีเมลจริงหรือไม่ ทางออกที่ดี ตัวอย่างที่ดีคือถ้าคุณต้องการให้ชื่อผู้ใช้ของบุคคลนั้นเป็นที่อยู่อีเมล หากผู้ใช้พิมพ์เป็น 'sexy_chick_23' คุณสามารถใช้ regex นี้เพื่อให้พวกเขารู้ว่าอีเมลคาดหวัง หากพิมพ์บางสิ่งที่ดูเหมือนอีเมล แต่ไม่ใช่ผู้ใช้จะไม่ได้รับอีเมล 'ยืนยัน' และกระบวนการลงทะเบียนจะไม่ถูกตรวจสอบ
Chris Dutrow

23

เพียงตรวจสอบว่าที่อยู่อีเมลที่ป้อนนั้นถูกต้องหรือไม่ใช้ HTML

<input type="email"/>

ไม่จำเป็นต้องเขียนฟังก์ชันเพื่อตรวจสอบความถูกต้อง


4
IE <10 ไม่สนับสนุนสิ่งนี้และเบราว์เซอร์ของ Android เอง
Frank Conijn

7
Upvoting IE <10 ตายแล้ว
Michael Scheper

19

มันยากที่จะได้รับการตรวจสอบอีเมลที่ถูกต้อง 100% วิธีการแก้ไขที่ถูกต้องคือการส่งอีเมลทดสอบไปยังบัญชี ที่กล่าวว่ามีการตรวจสอบขั้นพื้นฐานเล็กน้อยที่สามารถช่วยตรวจสอบให้แน่ใจว่าคุณได้รับสิ่งที่สมเหตุสมผล

บางสิ่งที่ต้องปรับปรุง:

แทนที่จะเป็นเรื่องใหม่RegExpลองเขียนสิ่งต่อregexpไปนี้:

if (reg.test(/@/))

ประการที่สองตรวจสอบเพื่อให้แน่ใจว่ามีจุดที่มาหลัง@เครื่องหมายและตรวจสอบให้แน่ใจว่ามีตัวอักษรระหว่าง@s และจุด


19

นี่คือวิธีตรวจสอบความถูกต้องของโหนด :

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

ใช้รหัสนี้ภายในฟังก์ชันตัวตรวจสอบความถูกต้องของคุณ:

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

อื่น ๆ ที่คุณสามารถใช้jQuery กฎภายในกำหนด:

eMailId: {
    required: true,
    email: true
}

1
abc@xyzเป็นอีเมลที่ถูกต้องสมบูรณ์ที่ไม่รู้จักโดย regex ของคุณ
โตโต้

3
ไม่มันไม่ใช่. รูปแบบอีเมลที่ถูกต้องคือ something@something.something, abc @ xyz ไม่ตรงกับรูปแบบดังกล่าว ดังนั้นมันไม่ใช่ที่อยู่ที่ถูกต้อง
ออร์คิด


5
คุณหน้าวิกิพีเดียหรือไม่? TLD เป็นชื่อโฮสต์ที่ถูกต้อง ดังนั้นที่abc@tldอยู่อีเมลที่ถูกต้องคือ
โตโต้

2
วิธีเดียวในการตรวจสอบที่อยู่อีเมลคือการส่งอีเมลจากนั้นรอการตอบกลับ นอกจากนี้ที่นี่เป็น URL ที่คุณสามารถทดสอบว่าที่อยู่ของคุณเป็นไปตาม RFC822: mythic-beasts.com/~pdw/cgi-bin/emailvalidate คุณจะเห็นว่า abc @ xyz เป็นที่อยู่ที่ถูกต้องสำหรับ RFC822
โตโต้

14

Regex อัพเดทปี 2018! ลองนี้

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 สมบูรณ์แล้ว

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

ข้อมูลเพิ่มเติมhttps://git.io/vhEfc


สิ่งนี้ล้มเหลวสำหรับ
email@domain.com

1
@RickS สิ่งนี้ไม่เป็นความจริง โปรดตรวจสอบอีกครั้ง
malimo

13

โซลูชันที่ไม่ตรวจสอบว่า TLD มีอยู่ไม่สมบูรณ์

คำตอบสำหรับคำถามนี้เกือบทั้งหมดแนะนำให้ใช้ Regex เพื่อตรวจสอบที่อยู่อีเมล ฉันคิดว่า Regex นั้นดีสำหรับการตรวจสอบเบื้องต้นเท่านั้น ดูเหมือนว่าการตรวจสอบความถูกต้องของที่อยู่อีเมลเป็นปัญหาที่แยกกันสองอย่าง:

1- การตรวจสอบความถูกต้องของรูปแบบอีเมล:ตรวจสอบให้แน่ใจว่าอีเมลเป็นไปตามรูปแบบและรูปแบบของอีเมลใน RFC 5322 และหาก TLD มีอยู่จริง รายการ TLDs ที่ถูกต้องทั้งหมดสามารถพบได้ที่นี่

ตัวอย่างเช่นแม้ว่าที่อยู่example@example.cccจะผ่าน regex แต่ไม่ใช่อีเมลที่ถูกต้องเนื่องจากcccไม่ใช่ IANA โดเมนระดับบนสุด

2- การทำให้แน่ใจว่าอีเมลที่มีอยู่จริง:สำหรับการทำเช่นนี้เป็นตัวเลือกเดียวคือการส่งอีเมลผู้ใช้


13

Regex สำหรับการตรวจสอบที่อยู่อีเมล

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

ฉันไม่เห็น regexp ของคุณใน RFC5322: tools.ietf.org/html/rfc5322 - มีข้อผิดพลาดหรือไม่?
Kamil Kiełczewski

"regex ที่ดีที่สุดที่เคย" อาจเป็นคำอธิบายบางอย่างที่นี่?
connectyourcharger

ทำไมโย่บอกว่าเป็นทางออกที่ดีที่สุดของทั้งหมดที่คุณสามารถอธิบายเล็ก ๆ น้อย ๆ ขึ้นโปรด?
nancoder

ฉันจำไม่ได้ว่าทำไมฉันถึงเขียน "regex ที่ดีที่สุดตลอดกาล" ขอโทษนะที่รบกวนคุณ
Prabhat Kasera

12

นี่คือการสนทนาที่ดีมากเกี่ยวกับการใช้นิพจน์ทั่วไปเพื่อตรวจสอบที่อยู่อีเมล "การเปรียบเทียบที่อยู่อีเมลเพื่อตรวจสอบนิพจน์ปกติ "

นี่คือนิพจน์ยอดนิยมปัจจุบันที่เข้ากันได้กับ JavaScript เพื่อการอ้างอิง:

/^[-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 การขึ้นบัญชีขาวทำให้เป็นที่ต้องการมาก - โดยเฉพาะอย่างยิ่งคุณพลาด.jobsไป นอกจากนี้ยังมี IDN แบบสด (ซึ่งฉันยอมรับว่าส่วนใหญ่ได้รับการอนุมัติเฉพาะหลังจากโพสต์ของคุณเช่น.中國ในเดือนมิถุนายน 2010 แต่ส่วนใหญ่อยู่ในงานมาหลายปี)
Piskvor ออกจากอาคาร

2
-1 อย่าใช้โดเมนระดับบนสุดคงที่ มีเสมอ (และจะมีตัวอย่างเช่น 2013) สามารถเพิ่ม tld ใหม่ได้
miho

มีการยืนยัน TLD ใหม่ 100 รายการ คำตอบนี้ไม่ถูกต้องและไม่ควรใช้
Dean Meehan

ได้. ฉันเคยพูดไว้ในปี 2011 และฉันจะพูดอีกครั้ง: รายการที่อนุญาตของโดเมน "พิเศษ" จะเลวร้ายลงเมื่อเวลาผ่านไปเนื่องจาก TLDs ได้รับการอนุมัติมากขึ้น มี TLD ที่ถูกต้องมากกว่า 100 รายการที่ไม่ตรงกับบัญชีขาวด้านบน: en.wikipedia.org/wiki/List_of_Internet_top-level_domains
Piskvor ออกจากอาคาร

ปี 2558 การแสดงออกของคุณไม่เป็นประโยชน์ คุณควรจดคำตอบนี้ไว้ แต่คุณอาจจะยุ่งเกินไปกับการแก้ไขหน้าทั้งหมดที่คุณใส่นิพจน์นี้ ขวา?
Eric Leroy

12

เห็นได้ชัดว่ามัน:

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

นำมาจากhttp://fightingforalostcause.net/misc/2006/compare-email-regex.phpในวันที่ 1 ต.ค. 53

แต่แน่นอนว่าไม่สนใจความเป็นสากล


12

ตรงกันข้ามกับsquirtleนี่เป็นวิธีการแก้ปัญหาที่ซับซ้อน แต่มันก็เป็นงานที่ดีในการตรวจสอบอีเมลที่ถูกต้อง:

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

ใช้อย่างนั้น:

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

10
คุณไม่ต้องการ== trueตัวอย่างของคุณ
Luke Alderton

11

ความรู้ของฉันเกี่ยวกับการแสดงออกปกติไม่ดี นั่นเป็นเหตุผลที่ฉันตรวจสอบไวยากรณ์ทั่วไปด้วยนิพจน์ทั่วไปอย่างง่ายก่อนและตรวจสอบตัวเลือกที่เฉพาะเจาะจงมากขึ้นด้วยฟังก์ชั่นอื่น ๆ ในภายหลัง นี่อาจไม่ใช่โซลูชันทางเทคนิคที่ดีที่สุด แต่วิธีนี้ฉันยืดหยุ่นและรวดเร็วขึ้น

ข้อผิดพลาดที่พบบ่อยที่สุดที่ฉันเจอคือช่องว่าง (โดยเฉพาะที่จุดเริ่มต้นและจุดสิ้นสุด) และบางครั้งก็เป็นจุดสองเท่า

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>

บางทีถ้าคุณเพิ่มคำอธิบายหรือคำอธิบายลงไปด้วย? ฉันไม่คิดว่าคุณจะต้องแสดง html ใด ๆ จริงๆ ทุกคนเกี่ยวข้องกับคือ javascript และ regex หากคุณลดคำตอบของคุณลงไปแค่เพียงจาวาสคริปต์และเพิ่มความกระจ่างแจ้งเล็ก ๆ น้อย ๆ เพื่อไปกับมันผมจะยกระดับให้คุณ
bgmCoder

9

ฉันกำลังมองหา Regex ใน JS ที่ผ่านทุกกรณีทดสอบที่อยู่อีเมล:

  • email@example.com อีเมลที่ถูกต้อง

  • firstname.lastname@example.com อีเมลมีจุดในช่องที่อยู่

  • email@subdomain.example.com อีเมลมีจุดที่มีโดเมนย่อย

  • firstname+lastname@example.com เครื่องหมายบวกถือเป็นตัวละครที่ถูกต้อง

  • email@192.0.2.123 โดเมนเป็นที่อยู่ IP ที่ถูกต้อง

  • email@[192.0.2.123] เครื่องหมายวงเล็บเหลี่ยมรอบที่อยู่ IP ถือว่าใช้ได้

  • “email”@example.com เครื่องหมายคำพูดรอบอีเมลถือว่าถูกต้อง

  • 1234567890@example.com ตัวเลขในที่อยู่นั้นถูกต้อง

  • email@domain-one.example เครื่องหมายขีดกลางในชื่อโดเมนนั้นถูกต้อง

  • _______@example.com ขีดล่างในฟิลด์ที่อยู่นั้นถูกต้อง

  • email@example.name .name เป็นชื่อโดเมนระดับบนสุดที่ถูกต้อง

  • email@example.co.jpDot ในชื่อโดเมนระดับบนยังถือว่าถูกต้อง (ใช้co.jpเป็นตัวอย่างที่นี่)

  • firstname-lastname@example.com ช่องที่อยู่ในช่องนั้นถูกต้อง

ไปเลย :

http://regexr.com/3f07j

หรือ regex:

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

8

นิพจน์ปกติที่จัดทำโดย Microsoft ภายในASP.NET MVCคือ

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

ซึ่งฉันโพสต์ที่นี่ในกรณีที่มีข้อบกพร่อง - แม้ว่ามันจะสมบูรณ์แบบสำหรับความต้องการของฉัน


1
ไม่อนุญาตให้ใช้ + ในส่วนชื่อของอีเมล
Paul Go
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.