เหตุใดการตรวจสอบความถูกต้องของฟอร์ม HTML5 จึงอนุญาตให้ใช้อีเมลที่ไม่มีจุด


113

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

กล่าวอีกนัยหนึ่ง "john @ doe" ถือว่าถูกต้องเมื่อเห็นได้ชัดว่าไม่ใช่ที่อยู่อีเมลที่ถูกต้อง "doe" ไม่ใช่โดเมน

นี่คือวิธีการเข้ารหัสฟิลด์อีเมลของฉัน:

<input type="email" required />

แค่นั้นยังไม่พอ?

ตรวจสอบซอนี้เพื่อดูว่าฉันหมายถึงอะไร

หมายเหตุ: ฉันรู้วิธีดำเนินการผ่านรูปแบบ RegEx แทน ฉันแค่สงสัยว่าใครบางคนสามารถหลีกเลี่ยงการใช้ประเภทอีเมลแทนได้อย่างไร


10
In other words, "john@doe" is considered valid, when it's clearly not a valid email address; doe isn't a domain.ใช่doeแน่นอนสามารถเป็นโดเมน (คิดว่าlocalhost) และที่อยู่นั้นถูกต้องทางเทคนิคตามข้อมูลจำเพาะ
สมัคร

2
@admdrew เหอ ... นั่นเป็นกรณีที่น่าสนใจถ้าคุณส่งอีเมลจากเซิร์ฟเวอร์อีเมลเองและตัดสินใจเขียนว่า "friend @ localhost"
Katana314

@ katana314 - เดี๋ยวก่อนใช่แล้ว เซิร์ฟเวอร์อีเมล (กำหนดค่าไว้อย่างดี) ส่วนใหญ่จะปฏิเสธข้อความที่ส่งไปยังที่อยู่ซึ่งไม่ตรงกับโดเมนที่คาดไว้ดังนั้นโดยทั่วไปการพูดจะไม่มีปัญหากับlocalhostที่อยู่
สมัคร

คำตอบ:


84

เนื่องจาก @ b เป็นที่อยู่อีเมลที่ถูกต้อง (เช่น localhost เป็นโดเมนที่ถูกต้อง) ดูhttp://en.wikipedia.org/wiki/Email_address#Examples

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


7
ขอบคุณ ฉันไม่เห็นว่า บริษัท ใดจะได้รับประโยชน์จากการตรวจสอบอีเมลแบบสำเร็จรูปนี้ Facebook จะไม่อนุญาตให้ใครบางคนสมัครด้วยที่อยู่ a @ b ขอบคุณสำหรับข้อมูล (ฉันไม่ได้ลงคะแนนคำตอบของคุณ)
WEFX

6
ในกรณีของเว็บไซต์เช่น Facebook ที่มีการเข้าถึงแบบสาธารณะจะไม่มีประโยชน์ แต่นึกถึงเว็บไซต์ภายใน คุณอาจต้องการเขียนถึง joe @ support แต่ฉันก็คิดว่ามันเป็นการใช้งานขั้นต่ำ อย่างไรก็ตามเว็บเบราว์เซอร์จะต้องใช้งานตามมาตรฐาน (เช่น RFCs) โดยไม่อิงตามกรณีที่พบบ่อยที่สุด
Ali Alavi

9
ฉันสงสัยว่าครั้งสุดท้ายที่มีคนส่งอีเมลถึง localhost จริงๆ!
Matthew Lock

2
เป็นที่อยู่อีเมลที่ใช้งานได้สั้นที่สุดแห่งหนึ่ง ( recordsetter.com/world-record/shortest-email-address/4327 ) คือau@ua
Kyborek

132

ในทางทฤษฎีคุณสามารถมีที่อยู่ได้โดยไม่ต้องมี "." ใน.

เนื่องจากในทางเทคนิคเช่น:

user@com
user@localserver
user@[IPv6:2001:db8::1]

เป็นอีเมลที่ถูกต้องทั้งหมด

ดังนั้นการตรวจสอบ HTML5 มาตรฐานจึงอนุญาตให้ใช้อีเมลที่ถูกต้องทั้งหมดรวมถึงอีเมลที่ผิดปกติ

สำหรับคำอธิบายที่อ่านง่าย (แทนที่จะอ่านผ่านมาตรฐาน): http://en.wikipedia.org/wiki/Email_address#Examples


1
เห็นด้วยข้อนี้ตอบโจทย์ 'ทำไม' ไม่ใช่ 'วิธีแก้ปัญหา' ฉันก็อยากรู้เหมือนกันว่าทำไม ตอนนี้ฉันรู้ว่าจะไม่ "แก้ไข"
Eleanor Zimmermann

ตัวอย่างประเภทแรกคือโดเมนuzซึ่งชี้ไปที่ IP โดยตรง ณ เดือนตุลาคม 2018 หากคุณทำสิ่งnslookup uzนี้จะชี้ไปที่91.212.89.8ดังนั้นจึงควรมีอีเมลในโดเมนนี้ด้วย
PulseJet

36

ลองเพิ่มสิ่งนี้ลงในอินพุต

pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$"

ซอ


2
ด้วยโดเมนใหม่จำนวนมากที่พร้อมใช้งานเช่น (นักบัญชี [11] นานาชาติ [13] ฯลฯ ) และความยาวสูงสุดที่เป็นไปได้ที่ 63 ค่าความยาวของรูปแบบนิพจน์ทั่วไปควรเป็น {2, 63}
unasAquila

42
-1 ประการแรกคุณยังไม่ได้พยายามอธิบายว่าสิ่งนี้อนุญาตหรือ จำกัด อะไรและทำไมใครบางคนถึงต้องการกฎเหล่านั้น ประการที่สองมีข้อ จำกัด มากกว่าใบอนุญาตมาตรฐาน (ฉันจะไม่แสร้งทำเป็นว่าได้อ่านและทำตามมาตรฐาน แต่ดูตัวอย่างเช่นen.wikipedia.org/wiki/Email_address#Internationalizationหรือคำถามเกี่ยวกับการตรวจสอบอีเมลจำนวนมากใน Stack ล้นสำหรับตัวอย่างที่อยู่อีเมลแปลก ๆ ) ทำไปทำไม? หากมีคนป้อนสิ่งที่ผิดปกติเป็นอีเมลของพวกเขาเพียงแค่ยอมรับมันมีโอกาสที่พวกเขาจะรู้ดีกว่าคุณ
Mark Amery

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

1
สิ่งนี้ควรมี ^ แสดงว่าควรเริ่มการจับคู่จากจุดเริ่มต้นของสตริงและยอมรับตัวพิมพ์ใหญ่ด้วย:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
Kohjah Breese

13

RFC 822 , บทที่ 6 ให้สเปคของที่อยู่ในการเติมคัส-Naur ฟอร์ม (BNF) นี้:

addr-spec   =  local-part "@" domain
local-part  =  word *("." word)
domain      =  sub-domain *("." sub-domain)

การใช้ข้อกำหนดนี้ a@bนี้เป็นที่อยู่ที่ถูกต้อง

UPDATE

เพื่อตอบความคิดเห็นของ Trejkaz ฉันเพิ่มคำจำกัดความต่อไปนี้ เราเห็นว่าอนุญาตให้ใช้ SPACE ได้ แต่เฉพาะในสตริงที่ยกมา

word          =  atom / quoted-string
atom          =  1*<any CHAR except specials, SPACE and CTLs>
quoted-string = <"> *(qtext/quoted-pair) <">
SPACE         =  <ASCII SP, space>
CTL           =  <any ASCII control character and DEL> 
qtext         =  <any CHAR excepting <">, "\" & CR, and including linear-white-space>
quoted-pair   =  "\" CHAR  

OTOH, RFC 822 ยังอนุญาตให้ฉันใส่ช่องว่างในส่วนภายในซึ่งอย่างน้อย Chrome ก็ดูเหมือนจะไม่อนุญาตดังนั้นฉันไม่แน่ใจว่าพวกเขาใช้ RFC เป็นข้อมูลอ้างอิง (แม้ว่าพวกเขาควรจะเป็น!)
Trejkaz

8

ในหน้า MDN นี้จะแสดงเบราว์เซอร์ regex ที่ควรใช้เพื่อตรวจสอบความถูกต้องของอีเมล:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#Validation

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

<input type="email" pattern="^[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])?)+$"></input>

3

คุณสามารถปรับแต่งรูปแบบของช่องอีเมล:

input:valid {
  border-color: green
}

input:invalid {
  border-color: red
}
Email:
<input type="email" required value="a@b.c" /><br>

Non-dots Email:
<input type="email" required pattern="[^.]+@[^.]+" value="a@b.c" />


2

นี่คือวิธีที่คุณสามารถทำได้ด้วย html5 โดยใช้รูปแบบ regex คุณยังสามารถรวมข้อความที่กำหนดเองเพื่อแสดง

<form>
  <input type="email" value="paul@test" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$" title="Hey, you are missing domain part in the email !!!"/>
  <button type="submit">Click Me</button>
</form>


-5

รูปแบบนี้ใช้ได้กับฉันเสมอ

ข้อความต้องเป็นตัวพิมพ์เล็ก pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"แต่ฉันคิดว่ามันครอบคลุมอีเมลส่วนใหญ่ไม่มากก็น้อย

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