当前位置: 首页 > 知识库问答 >
问题:

如何使用HTML5输入验证来验证表单输入

司空丰
2023-03-14

我试图找到一个完整的模式列表,用于通过HTML5表单验证各种类型的输入,特别是URLemailtel等等,但我找不到任何模式。目前,这些输入验证的内置版本远非完美(tel甚至不检查输入的内容是否是电话号码)。所以我想知道,我可以使用哪些模式来验证用户在输入中输入了正确的格式?

以下是一些默认验证允许不允许的输入的例子:

这个字段允许在@后面有不正确域的电子邮件,它允许地址以破折号或句号开始或结束,这也是不允许的。因此,.example-@x是允许的。

这个输入基本上允许任何以http://(Chrome)开头,后面跟着一些特殊字符的输入,比如在URL中有函数的字符(\,@,#,~等)。在FF中,所要检查的是它是否以http://code>开头,后面是:以外的任何内容(在FF中甚至只允许http://code>)。IE的功能与FF相同,只是它不禁止http://code>。

例如:http://.在这三个选项中都是允许的。http://,也是如此。

目前,在任何主要浏览器中都没有对电话号码进行内置验证(它的功能与type=“text”完全相同,只是告诉移动浏览器要显示哪种键盘。

因此,既然浏览器在每种情况下都不显示一致的行为,而且它们所显示的行为是非常基本的,带有许多假阳性,那么我可以做什么来验证我的HTML表单(仍然使用HTML5输入验证)?

PS:我发布这个是因为我会发现自己有一个完整的表单验证模式列表很有用,所以我想这对其他人也很有用(当然其他人也可以发布他们的解决方案)。


共有1个答案

戚宏扬
2023-03-14

这些模式不一定很简单,但我认为在每种情况下都是最有效的。请记住,(最近)国际化域名也是可用的。这样,URL中就允许不可测试的字符数量(域名中仍然存在许多不允许的字符,但是允许的字符列表非常大,并且对于不同的顶级域会经常变化,因此跟上它们是不实际的)。如果要支持国际化域名,则应使用第二种URL模式,否则使用第一种。

下面是一个现场演示,可以看到下面的模式在起作用。向下滚动以获得对这些模式的解释、推理和分析

URL

https?:\/\/(?![^\/]{253}[^\/])((?!-.*|.*-\.)([a-zA-Z0-9-]{1,63}\.)+[a-zA-Z]{2,15}|((1[0-9]{2}|[1-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}(1[0-9]{2}|[1-9]?[0-9]|2([0-4][0-9]|5[0-5])))(\/.*)?
https?:\/\/(?!.{253}.+$)((?!-.*|.*-\.)([^ !-,\.\/:-@\[-`{-~]{1,63}\.)+([^ !-\/:-@\[-`{-~]{2,15}|xn--[a-zA-Z0-9]{4,30})|(([01]?[0-9]{2}|2([0-4][0-9]|5[0-5])|[0-9])\.){3}([01]?[0-9]{2}|2([0-4][0-9]|5[0-5])|[0-9]))(\/.*)?
(?!(^[.-].*|[^@]*[.-]@|.*\.{2,}.*)|^.{254}.)([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~.-]+@)(?!-.*|.*-\.)([a-zA-Z0-9-]{1,63}\.)+[a-zA-Z]{2,15}
((\+|00)?[1-9]{2}|0)[1-9]( ?[0-9]){8}
((\+|00)?[1-9]{2}|0)[1-9]([0-9]){8}
([A-ZΆ-ΫÀ-ÖØ-Þ][A-ZΆ-ΫÀ-ÖØ-Þa-zά-ώß-öø-ÿ]{1,19} ?){1,10}
https?:\/\/(?![^\/]{253}[^\/])((?!-.*|.*-\.)([a-zA-Z0-9-]{1,63}\.)+[a-zA-Z]{2,15}|((1[0-9]{2}|[1-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}(1[0-9]{2}|[1-9]?[0-9]|2([0-4][0-9]|5[0-5])))(\/.*)?
    null
    null

请注意,现代浏览器中内置的默认http:.*模式将始终被强制执行,因此,即使在此模式中删除https?://,它仍将被强制执行。使用type=“text”来避免这种情况。

https?:\/\/(?!.{253}.+$)((?!-.*|.*-\.)([^ !-,\.\/:-@\[-`{-~]{1,63}\.)+([^ !-\/:-@\[-`{-~]{2,15}|xn--[a-zA-Z0-9]{4,30})|(([01]?[0-9]{2}|2([0-4][0-9]|5[0-5])|[0-9])\.){3}([01]?[0-9]{2}|2([0-4][0-9]|5[0-5])|[0-9]))(\/.*)?

说明:

由于IDN中允许有大量字符,所以实际上不可能在HTML属性中列出所有可能的组合(您会得到一个巨大的模式,因此在这种情况下,最好使用其他方法来测试它,而不是regex)[5]

    null
(?!(^[.-].*|[^@]*[.-]@|.*\.{2,}.*)|^.{254}.)([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~.-]+@)(?!-.*|.*-\.)([a-zA-Z0-9-]{1,63}\.)+[a-zA-Z]{2,15}
  • 电子邮件地址只能包含拉丁字母、数字0-9和中的字符!#$%&'*+\/=?^_``{}~。-[6].
  • 重音不是普遍支持的[7],但如果需要,请发表评论,我也许可以编写一个符合RFC6530标准的版本。
  • 本地部分(@之前的长度只能是63个字符,总地址长度只能是254个字符[8].
  • 地址不能以-开始或结束。并且不能连续出现两个点[8].
  • 域可能不是IP地址[9]
    • 除此之外,我只包含了模式的非IDN部分。但是IDN也是允许的,所以它们会导致假阴性。
    ((\+|00)?[1-9]{2}|0)[1-9]( ?[0-9]){8}
    ((\+|00)?[1-9]{2}|0)[1-9]([0-9]){8}
    

    说明:

    • 电话号码必须以下列之一开头,其中[CTRY]代表国家代码,X代表第一个非零数字(如移动号码中的6),
      • 00[CTRY]x
      • +[CTRY]x
      • 0x
      • [CTRY]x(这不是官方正确的语法,但Chrome自动填充似乎出于某种原因喜欢它。)
      ([A-ZΆ-ΫÀ-ÖØ-Þ][A-ZΆ-ΫÀ-ÖØ-Þa-zά-ώß-öø-ÿ]{1,19} ?){1,10}
      

        null
      1. https://en.wikipedia.org/wiki/domain_name_system#domain_name_syntax→https://tools.ietf.org/html/RFC1034#section-3.1
      2. https://en.wikipedia.org/wiki/list_of_internet_top-level_domains/https://www.icann.org/resources/pages/tlds-2012-02-25-en
      3. https://en.wikipedia.org/wiki/domain_name#technical_requirements_and_process/子域中允许的字符是什么
      4. 因为浏览器和Windows cmd行都不允许填充格式
      5. 子域中允许哪些字符→http://www.domainnameshop.com/faq.cgi?id=8&session=106ee5e67d523298
      6. https://en.wikipedia.org/wiki/email_address#local_part/电子邮件地址中允许使用哪些字符?
      7. https://en.wikipedia.org/wiki/email_地址#国际化
      8. https://en.wikipedia.org/wiki/email_地址#语法→http://tools.ietf.org/html/RFC5321#Section-4.5.3.1
      9. 使用IP地址而不是域名发送电子邮件

 类似资料:
  • 问题内容: 我的联系页面形式如下, 需要为所有字段添加验证。谁能帮我在此反应形式中添加验证? 问题答案: 您应该避免使用refs,可以使用function来实现。 每次更改时,请更新已更改字段的状态。 然后,您可以轻松地检查该字段是否为空或您想要的其他内容。 您可以执行以下操作: 在此示例中,我仅对电子邮件和姓名进行了验证,但是您知道如何进行验证。其余的你可以自己做。 也许有更好的方法,但是您会明

  • 开发Web的一个原则就是,不能信任用户输入的任何信息,所以验证和过滤用户的输入信息就变得非常重要,我们经常会在微博、新闻中听到某某网站被入侵了,存在什么漏洞,这些大多是因为网站对于用户输入的信息没有做严格的验证引起的,所以为了编写出安全可靠的Web程序,验证表单输入的意义重大。 我们平常编写Web应用主要有两方面的数据验证,一个是在页面端的js验证(目前在这方面有很多的插件库,比如Validati

  • 问题内容: 我是从记录用户输入使用。我需要验证输入内容,例如: 必须为非负数 它必须是字母 …等等 最好的方法是什么? 问题答案: 示例1:验证正整数 这是一个用于int从输入中验证肯定的简单示例。 结果: 请注意,与更详细组合相比,使用起来要容易得多。通过合同,一个 保证,如果它,然后将安静地给你int,并不会引发任何。 示例2:同一令牌上有多个 请注意,上面的代码段包含一个语句,以使Scann

  • 根据经验,您永远不应该信任从最终用户收到的数据, 并且应该在充分利用之前对其进行验证。 要给 model 填充其所需的用户输入数据,你可以调用 yii\base\Model::validate() 方法验证它们。该方法会返回一个布尔值,指明是否通过验证。若没有通过,你能通过 yii\base\Model::$errors 属性获取相应的报错信息。比如, $model = new \app\mode

  • 主要内容:输入验证,应用代码,实例解析AngularJS 表单和控件可以验证输入的数据。 输入验证 在前面的几个章节中,你已经学到关于 AngularJS 表单和控件的知识。 AngularJS 表单和控件可以提供验证功能,并对用户输入的非法数据进行警告。 客户端的验证不能确保用户输入数据的安全,所以服务端的数据验证也是必须的。 应用代码 < !DOCTYPE html > < html > < script src= "http:/

  • 有人能帮我完成输入验证功能吗。我正在验证整数输入。问题是当用户输入多个整数my cin时。fail()对每个整数运行,导致我的错误显示多次。让我告诉你我的意思 这是我的代码: 因此,如果用户要输入“jjj”;我的“请只输入整数”显示三次。我只想让它显示一次。我不知道怎么做。有什么想法吗?