首页 文章

为什么HTML5表单验证允许没有点的电子邮件?

提问于
浏览
84

我正在编写一个非常简单的模型来演示一些HTML5表单验证 . 但是,我注意到电子邮件验证没有检查地址中的点,也没有检查点后面的字符 .

换句话说,“john @ doe”被认为是有效的,当它显然不是有效的电子邮件地址时; “doe”不是域名 .

这就是我编写电子邮件字段的方式:

<input type="email" required />

这还不够吗?

检查这个fiddle看看我的意思 .

注意:我知道如何通过RegEx模式来实现这一点 . 我只是想知道如何使用电子邮件类型取而代之 .

8 回答

  • 2

    因为@b是有效的电子邮件地址(例如localhost是有效的域) . 见http://en.wikipedia.org/wiki/Email_address#Examples

    另外,请记住,您应该始终在服务器中进行输入验证 . 客户端验证应仅用于向用户提供反馈而不是依赖,因为它可以被轻松绕过 .

  • 115

    理论上你可以有一个没有“ . ”的地址 . 在 .

    从技术上来说,例如:

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

    都是有效的电子邮件 .

    因此,标准的HTML5验证允许所有有效的电子邮件,包括不常见的电子邮件 .

    对于一些易于阅读的解释(而不是阅读标准):http://en.wikipedia.org/wiki/Email_address#Examples

  • 13

    尝试将此添加到输入中

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

    Fiddle

  • -6

    RFC 822,第6章给出了增强Backus-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
    
  • -4

    您可以自定义电子邮件字段的模式:

    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" />
    
  • 35

    在此MDN页面上,它显示正则表达式浏览器应用于验证电子邮件:

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

    您可以稍微更改此正则表达式以要求域名中至少有一个点:将正则表达式末尾的星号 * 更改为加号 + . 然后使用该正则表达式作为 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

    这种模式总是适合我 .

    文本必须小写 pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" 但我认为它涵盖了或多或少的大多数电子邮件 .

  • 49

    这回答了这个问题 .

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

相关问题