การตรวจสอบอีเมล HTML5


102

มีคำกล่าวว่า "ด้วย HTML5 เราไม่จำเป็นต้องใช้ js หรือโค้ดฝั่งเซิร์ฟเวอร์อีกต่อไปเพื่อตรวจสอบว่าข้อมูลที่ป้อนของผู้ใช้เป็นอีเมลหรือที่อยู่ URL ที่ถูกต้องหรือไม่"

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

<input type="email" pattern="[^ @]*@[^ @]*" placeholder="Enter your email">
<input type="submit" value="Submit">

50
คุณจำเป็นต้องตรวจสอบความถูกต้องทางฝั่งเซิร์ฟเวอร์เสมอ ไคลเอนต์ที่ชาญฉลาดสามารถข้ามมาตรการรักษาความปลอดภัยฝั่งไคลเอ็นต์ได้
Benjamin Gruenbaum

คำตอบนี้อาจช่วยได้เมื่อพยายามตั้งค่าการตรวจสอบความถูกต้องของฟอร์ม HTML5 แน่นอนว่าคุณอาจยังต้องการการตรวจสอบฝั่งเซิร์ฟเวอร์
Joeytje50

2
ไม่ควรใช้การตรวจสอบอีเมล regex ในทุกกรณี การตรวจสอบ Regex มีข้อบกพร่องมากเกินไป วิธีที่ดีที่สุดในการ "ตรวจสอบ" ที่อยู่อีเมลคือให้พิมพ์สองครั้งและเรียกใช้การตรวจสอบ Regex ที่ให้คำเตือนแก่ผู้ใช้ว่าดูเหมือนที่อยู่อีเมลที่ไม่ถูกต้องหากไม่ตรงกับรูปแบบและ ขอให้ผู้ใช้ตรวจสอบอีกครั้ง วิธีนี้ถ้ามันถูกต้องจริง แต่ regex ล้มเหลว (เหมือนที่ทำบ่อยๆ) ผู้ใช้ก็สามารถรับทราบว่าพวกเขารู้ว่าถูกต้องและดำเนินการต่อ ไซต์จำนวนมากใช้การตรวจสอบความถูกต้องของ regex และเป็นเรื่องที่น่าหงุดหงิดสำหรับผู้ใช้จำนวนมาก
Soundfx4

ฉันแนะนำให้ตรวจสอบบทความนี้: debounce.io/blog/articles/email-validation-for-html5-forms
Iman Hejazi

การขอให้ผู้ใช้ป้อนที่อยู่อีเมลเดียวกันสองครั้งก็ไร้ผล หากคุณไม่ทราบที่อยู่อีเมลของพวกเขาการขอให้พิมพ์สองครั้งจะไม่ช่วยเพิ่มอัตราต่อรอง หากพวกเขารู้ที่อยู่อีเมลการขอให้พิมพ์สองครั้งเป็นเพียง UI ที่ไม่ดี
Mikko Rantalainen

คำตอบ:


120

ใน HTML5 คุณสามารถทำได้ดังนี้:

<form>
<input type="email" placeholder="Enter your email">
<input type="submit" value="Submit">
</form>

และเมื่อผู้ใช้กดส่งจะแสดงข้อความแสดงข้อผิดพลาดโดยอัตโนมัติเช่น:

ข้อความผิดพลาด


3
ประโยชน์ของรูปแบบที่นี่คืออะไร? การระบุประเภทเป็นอีเมลมีรูปแบบในตัวเพื่อกำหนดสิ่งนี้อยู่แล้ว
Rich Bradshaw

3
@RichBradshaw: ใช่คุณถูกต้อง ไม่ต้องระบุรูปแบบ (เพิ่ง copy code จาก OP ไปแก้ไขแล้ว :))
Midhun MP

6
@MichaelDeMutis: คุณสามารถใช้requiredแอตทริบิวต์
Midhun MP

29
อีเมลไม่ได้รับการตรวจสอบ.comในอีเมล ตรวจสอบเครื่องหมาย @ เท่านั้น เช่น ฉันสามารถป้อนexample@gmailและบันทึกแบบฟอร์ม แม้ว่าจะไม่ใช่ที่อยู่อีเมลที่ถูกต้อง มีวิธีแก้ปัญหาในการตรวจสอบอย่างถูกต้องexample@gmail.comหรือไม่?
Ruchika

9
@ ลิซ. example@gmailอาจไม่ใช่อีเมลที่ถูกต้อง แต่เป็นรูปแบบที่อยู่อีเมลที่ถูกต้อง
pajaja

47

input type=emailหน้าของwww.w3.orgบันทึกเว็บไซต์ที่อยู่อีเมลคือสตริงใด ๆ ที่ตรงกับการแสดงออกปกติต่อไปนี้:

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

ใช้requiredแอตทริบิวต์และpatternแอตทริบิวต์เพื่อกำหนดให้ค่าตรงกับรูปแบบนิพจน์ทั่วไป

<input
    type="text"
    pattern="/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/"
    required
>

14
คุณต้องแทรกรูปแบบโดยไม่มีสัญลักษณ์ '/' สองตัวและเริ่ม '^' และลงท้าย '$' เช่นนี้[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
วิกเตอร์

4
@Victor ขออภัยคุณผิดบางส่วน สัญลักษณ์นี้มีความสำคัญหากไม่มีรูปแบบจะเริ่มจับคู่ทุกที่ในสตริงและทำให้ไม่มีประโยชน์ จุดที่คุณถูกต้องคือการปล่อยเครื่องหมายทับออก
Hexodus

@ วิกเตอร์คำตอบของคุณใช้ได้กับฉัน regex ของ OP ให้คำพูดเชิงบวกที่ผิด ๆ กับฉันเพื่อให้ตรงกับข้อกำหนดของแบบฟอร์มแม้ว่าจะเป็นที่อยู่อีเมลที่ถูกต้องก็ตาม บางทีอาจเป็นเพราะฉันไม่ได้ใช้ HTML ปกติ แต่ใช้ React JS เพื่อแสดงผลรูปแบบ HTML
กะหมอก

ฉันเกือบจะโหวตสิ่งนี้เพราะคำตอบที่ถูกต้องคือการใช้type="email"และตรวจสอบvalidคุณสมบัติบูลีนบน DOMNode - ไม่จำเป็นต้องทำซ้ำ regex
Dominic

ขอขอบคุณที่กล่าวถึงเรื่องนี้
Stefan Ciprian Hotoleanu

17

ใช้[a-zA-Z0-9.-_]{1,}@[a-zA-Z.-]{2,}[.]{1}[a-zA-Z]{2,}สำหรับsomemail@email.com/somemail@email.com.vn


4
นิพจน์ทั่วไปนี้วางข้อกำหนดที่ไม่เหมาะสมจำนวนหนึ่งไว้บนที่อยู่อีเมลตัวอย่างเช่นปฏิเสธที่อยู่อีเมลที่มีชื่อผู้ใช้หนึ่งหรือสองตัวอักษรหรือโฮสต์อยู่ที่ชื่อโดเมนที่เป็นตัวอักษรตัวเดียว
duskwuff -inactive-

แก้ไขแล้ว ขอบคุณ @duskwuff
Van Nguyen

ยังคงปฏิเสธชื่อโดเมนตัวอักษรเดียว
duskwuff -inactive-

ซึ่งอนุญาตให้มีโดเมน 1 ตัวอักษร / ตัวเลข: [a-zA-Z0-9.-_] {1,} @ [a-zA-Z0-9 .-] {1,} [.] {1} [a-zA -Z0-9] {2,}
Rudder

นอกจากนี้โปรดทราบว่าตัวอย่างเช่นpostmaster@aiเป็นที่อยู่อีเมลที่ถูกต้องและ regexp นี้จะแบนเช่นกัน (ที่มา: serverfault.com/q/154991/104798 )
Mikko Rantalainen

12
document.getElementById("email").validity.valid

ดูเหมือนจะเป็นจริงเมื่อฟิลด์ว่างหรือถูกต้อง นอกจากนี้ยังมีธงที่น่าสนใจอื่น ๆ :

ใส่คำอธิบายภาพที่นี่

ทดสอบใน Chrome


8

นี่คือตัวอย่างที่ฉันใช้สำหรับอินพุตอีเมลทั้งหมดของฉัน ตัวอย่างนี้คือ ASP.NET แต่ใช้กับ:

<asp:TextBox runat="server" class="form-control" placeholder="Contact's email" 
    name="contact_email" ID="contact_email" title="Contact's email (format: xxx@xxx.xxx)" 
    type="email" TextMode="Email" validate="required:true"
    pattern="[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*" >
</asp:TextBox>

HTML5 ยังคงตรวจสอบความถูกต้องโดยใช้รูปแบบเมื่อไม่จำเป็น ยังไม่พบสิ่งที่เป็นผลบวกเท็จ

สิ่งนี้แสดงผลเป็น HTML ต่อไปนี้:

<input class="form-control" placeholder="Contact's email" 
    name="contact_email" id="contact_email" type="email" 
    title="Contact's email (format: xxx@xxx.xxx)" 
    pattern="[a-zA-Z0-9!#$%&amp;'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*">

7

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

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

var validations ={
    email: [/^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/, 'Please enter a valid email address']
};
$(document).ready(function(){
    // Check all the input fields of type email. This function will handle all the email addresses validations
    $("input[type=email]").change( function(){
        // Set the regular expression to validate the email 
        validation = new RegExp(validations['email'][0]);
        // validate the email value against the regular expression
        if (!validation.test(this.value)){
            // If the validation fails then we show the custom error message
            this.setCustomValidity(validations['email'][1]);
            return false;
        } else {
            // This is really important. If the validation is successful you need to reset the custom error message
            this.setCustomValidity('');
        }
    });
})

โปรดอย่าโพสต์คำตอบเฉพาะลิงก์ เพียงใส่ส่วนสำคัญของลิงก์ในคำตอบของคุณ
Rizier123

4

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

<input type="email" pattern="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$">

คุณสามารถค้นหา regex อื่น ๆ ทุกชนิดที่นี่


4

TL; DR:วิธีเดียวที่ถูกต้อง 100% คือตรวจสอบ @ - ลงชื่อที่ไหนสักแห่งในที่อยู่อีเมลที่ป้อนจากนั้นโพสต์ข้อความตรวจสอบความถูกต้องไปยังที่อยู่อีเมลที่ระบุ หากสามารถปฏิบัติตามคำแนะนำในการตรวจสอบความถูกต้องในข้อความอีเมลแสดงว่าที่อยู่อีเมลที่ป้อนนั้นถูกต้อง

คำตอบยาว:

David Gilbertson เขียนเมื่อหลายปีก่อน:

มีสองคำถามที่เราต้องถาม:

  1. ผู้ใช้เข้าใจหรือไม่ว่าพวกเขาควรจะพิมพ์ที่อยู่อีเมลลงในช่องนี้
  2. ผู้ใช้พิมพ์ที่อยู่อีเมลของตนเองลงในช่องนี้อย่างถูกต้องหรือไม่

หากคุณมีแบบฟอร์มที่มีป้ายกำกับว่า "อีเมล" และผู้ใช้ป้อนสัญลักษณ์ "@" ไว้ที่ไหนสักแห่งก็ปลอดภัยที่จะบอกว่าพวกเขาเข้าใจว่าพวกเขาควรจะป้อนที่อยู่อีเมล ง่าย.

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

เป็นไปไม่ได้.

[... ]

การพิมพ์ผิดจะส่งผลให้ที่อยู่อีเมลไม่ถูกต้องแน่นอนแต่อาจส่งผลให้ที่อยู่อีเมลไม่ถูกต้อง

[... ]

ไม่มีประเด็นที่จะพยายามหาว่าที่อยู่อีเมล 'ถูกต้อง' หรือไม่ ผู้ใช้ที่อยู่ห่างไกลมีแนวโน้มที่จะใส่ผิดที่ถูกต้องและที่อยู่อีเมลกว่าที่พวกเขาจะป้อนไม่ถูกต้อง

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

นอกจากนี้ที่อยู่อีเมลบางส่วนที่อาจไม่ถูกต้องตามหลักไวยากรณ์หรือทางการเมืองก็ใช้งานไม่ได้ ยกตัวอย่างเช่นpostmaster@aiไม่ได้ในทางเทคนิคทำงานแม้ว่า TLDs ไม่ควรมีระเบียน นอกจากนี้โปรดดูการอภิปรายเกี่ยวกับการตรวจสอบความถูกต้องของอีเมลในรายชื่ออีเมล WHATWG (โดยที่ HTML5 ได้รับการออกแบบมาตั้งแต่แรก)


2

ใช้ HTML 5 ให้ป้อนอีเมลเช่น:

<input type="email"/>

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


แต่กรณีเช่นนี้ไม่ถูกต้องเช่น "abc @ gmail"
nbsamar

ใช่ฉันคิดว่าอย่างนั้นฉันต้องการที่จะ valide ถ้าผู้ใช้ใส่ gmail หรือ hotmail เช่นถ้าผู้ใช้ของฉันใส่อื่นแล้วอย่าปล่อยให้พวกเขาดำเนินการต่อกับการเข้าสู่ระบบของฉันคุณรู้ไหมว่าฉันจะทำเช่นนั้นได้อย่างไร
ไซมอน

2

คุณสามารถทำตามรูปแบบนี้ได้เช่นกัน

<form action="/action_page.php">
  E-mail: <input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$">
  <input type="submit">
</form>

อ้างถึงใน W3Schools


1
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" title="please enter valid email [test@test.com].">คุณสามารถเพิ่มชื่อเพื่อแสดงข้อความความถูกต้อง
imdzeeshan

1

ตาม MDN RegExp นี้สามารถตรวจสอบความถูกต้องของอีเมลได้เนื่องจากอีเมลที่ตรงตามข้อกำหนดควรตรงกับอีเมลนั้น

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

0

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

การใช้pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"จะกำหนดให้ต้องใช้รูปแบบsomeone@email.comอย่างไรก็ตามหากผู้ส่งมีรูปแบบเหมือนsomeone@email.net.au(หรือคล้ายกัน) จะไม่ได้รับการตรวจสอบเพื่อแก้ไขปัญหานี้คุณสามารถวางpattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"สิ่งนี้จะตรวจสอบความถูกต้อง ".com.au หรือ. net.au หรือเหมือนกัน

อย่างไรก็ตามการใช้สิ่งนี้จะไม่อนุญาตให้ someone@email.com ตรวจสอบความถูกต้อง เท่าที่ใช้ HTML5 เพื่อตรวจสอบความถูกต้องที่อยู่อีเมลก็ยังไม่สามารถใช้ได้กับเราทั้งหมด ในการทำสิ่งนี้ให้เสร็จสมบูรณ์คุณจะใช้สิ่งนี้:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

หรือ:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

อย่างไรก็ตามฉันไม่ทราบวิธีตรวจสอบที่อยู่อีเมลทั้งสองหรือทุกเวอร์ชันโดยใช้แอตทริบิวต์รูปแบบ HTML5


1
ไม่ควรใช้การตรวจสอบ regex ในทุกกรณี มีลวดลายมากเกินไปและมีตำหนิมากเกินไป ตัวอย่างเช่น someone+customwordhere@email.com ถือว่าไม่ถูกต้องสำหรับการตรวจสอบ regex จำนวนมากเมื่อในความเป็นจริงมันถูกต้อง 100% Regex เป็นหนามในตัวของฉันและผู้ใช้อื่น ๆ อีกมากมายและมันต้องดำเนินต่อไป วิธีอื่นในการตรวจสอบว่าผู้ใช้ป้อนที่อยู่อีเมลที่ถูกต้องจะต้องใช้
Soundfx4

นอกจากนี้โปรดทราบว่าตัวอย่างเช่นpostmaster@aiเป็นที่อยู่อีเมลที่ถูกต้องและ regexp นี้จะแบนเช่นกัน (ที่มา: serverfault.com/q/154991/104798 )
Mikko Rantalainen

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