Regex HTML5模式属性:排除关键字

Regex HTML5模式属性:排除关键字,regex,html,forms,validation,Regex,Html,Forms,Validation,我正在尝试编写一个HTML5模式,以防止用户进入免费电子邮件帐户。到目前为止我有这个 <input name="email" placeholder="Work Email" required type="email" title="Enter a valid work email address (No free email services)" pattern="^((?!hotmail)(?!gmail)(?!ymail)(?!googlemail)(?!live)(?!gmx)(?

我正在尝试编写一个HTML5模式,以防止用户进入免费电子邮件帐户。到目前为止我有这个

<input name="email"
placeholder="Work Email"
required
type="email"
title="Enter a valid work email address (No free email services)"
pattern="^((?!hotmail)(?!gmail)(?!ymail)(?!googlemail)(?!live)(?!gmx)(?!yahoo)(?!outlook)(?!msn)(?!icloud)(?!facebook)(?!aol)(?!zoho)(?!mail)(?!yandex)(?!hushmail)(?!lycox)(?!lycosmail)(?!inbox)(?!myway)(?!aim)(?!fastmail)(?!goowy)(?!juno)(?!shortmail)(?!atmail)(?!protonmail).)*$"/>

很接近,但缺少两条关键规则

  • 应该只看“@”和“.”之间的内容
  • 应该不区分大小写
有什么办法让它工作吗

更新 为了避免关于我是否应该这样做的无益评论,请考虑其他输入用例不应该包含已知关键字列表的其他用例。类似的用例可以是咒骂词或ID前缀,其中存在多个前缀,但您希望避免只输入一种类型。。。ID不应包含IXT和用户输入。。。WIN-09880、IXT-2342、NTS-23422。

您不能:

  • 我发现了一个非详尽的免费电子邮件提供商列表,其中包含2840个条目

  • 您将阻止在Microsoft、Google、Facebook、Yahoo、ProtonMail、Free、Orange、Sfr和许多其他网站工作的用户

  • 您将如何处理拥有其域名的用户

    • 您不能:

      • 我发现了一个非详尽的免费电子邮件提供商列表,其中包含2840个条目

      • 您将阻止在Microsoft、Google、Facebook、Yahoo、ProtonMail、Free、Orange、Sfr和许多其他网站工作的用户

      • 您将如何处理拥有其域名的用户


      这是一个非常糟糕的主意,但本着回答您问题的精神,以下是我的答案

      您可以使用:

      pattern="^.+@((?!hotmail)(?!gmail)(?!ymail)(?!googlemail)(?!live)(?!gmx)(?!yahoo)(?!outlook)(?!msn)(?!icloud)(?!facebook)(?!aol)(?!zoho)(?!mail)(?!yandex)(?!hushmail)(?!lycox)(?!lycosmail)(?!inbox)(?!myway)(?!aim)(?!fastmail)(?!goowy)(?!juno)(?!shortmail)(?!atmail)(?!protonmail).)+\..+$"
      

      仅在“@”和“.”之间查找。HTML5不支持区分大小写的i标志,因此您需要在模式中使用JavaScript或硬编码区分大小写。

      这是一个非常糟糕的主意,但本着回答您问题的精神,我的答案如下

      您可以使用:

      pattern="^.+@((?!hotmail)(?!gmail)(?!ymail)(?!googlemail)(?!live)(?!gmx)(?!yahoo)(?!outlook)(?!msn)(?!icloud)(?!facebook)(?!aol)(?!zoho)(?!mail)(?!yandex)(?!hushmail)(?!lycox)(?!lycosmail)(?!inbox)(?!myway)(?!aim)(?!fastmail)(?!goowy)(?!juno)(?!shortmail)(?!atmail)(?!protonmail).)+\..+$"
      
      仅在“@”和“.”之间查找。HTML5不支持区分大小写的i标志,因此您需要在模式中使用JavaScript或硬编码区分大小写。

      以下是您的正则表达式的更正(并缩短)版本,它只针对地址的域部分:

      ^(?)*(:hotmail、gmail、ymail、Google mail、live、gmx、yahoo、outlook、msn、icloud、facebook、aol、zoho、mail、yandex、hushmail、lycosmail、inbox、myway、aim、fastmail、goowy、Atjuno、Protomail.*>

      如果需要,您可以进一步缩短它:

      ^(?)*(:live | gmx | yahoo | outlook | msn | icloud | facebook | aol | zoho | yandex | lycox | inbox | myway aim | goowy | juno |(?:hot |[gy y]| google short | at | proton | hush | lycos | | | fast | | | | | | |

      您不能使其不区分大小写,因为JavaScript正则表达式风格不支持内联修饰符,这非常令人烦恼。但是你必须使用正则表达式吗?我更喜欢使用可更新的禁用域列表的代码解决方案。

      以下是您的正则表达式的更正(并缩短)版本,它只针对地址的域部分:

      ^(?)*(:hotmail、gmail、ymail、Google mail、live、gmx、yahoo、outlook、msn、icloud、facebook、aol、zoho、mail、yandex、hushmail、lycosmail、inbox、myway、aim、fastmail、goowy、Atjuno、Protomail.*>

      如果需要,您可以进一步缩短它:

      ^(?)*(:live | gmx | yahoo | outlook | msn | icloud | facebook | aol | zoho | yandex | lycox | inbox | myway aim | goowy | juno |(?:hot |[gy y]| google short | at | proton | hush | lycos | | | fast | | | | | | |


      您不能使其不区分大小写,因为JavaScript正则表达式风格不支持内联修饰符,这非常令人烦恼。但是你必须使用正则表达式吗?我更喜欢使用可更新的禁用域列表的代码解决方案。

      是的,请阅读更多关于lookaheads的内容,并进行测试,以更好地了解它们是什么以及它们是如何工作的。请注意,您可以在它们内部使用替换。搜索有关内联修改器的信息。请描述所有从“@”开始的内容。另外,阻止用户输入免费电子邮件地址是一个非常奇怪的想法。地址的这部分不需要区分大小写,电子邮件域不区分大小写,如果输入大小写很重要,您可以在从表单收到数据后进行字符串到小写的转换。如果它们在Facebook或Microsoft工作,该怎么办?还是在雅虎工作?您拒绝他们使用他们的工作电子邮件,而这正是您所要求的。@Martin我正在使用HTML5模式属性来阻止用户在表单字段中输入免费电子邮件帐户。因此,在用户提交表单以使用HTML5验证之前,需要转换为小写。我想我可以把它应用到模糊上。是的,多读一些关于lookaheads的文章,做一些测试来更好地理解它们是什么以及它们是如何工作的。请注意,您可以在它们内部使用替换。搜索有关内联修改器的信息。请描述所有从“@”开始的内容。另外,阻止用户输入免费电子邮件地址是一个非常奇怪的想法。地址的这部分不需要区分大小写,电子邮件域不区分大小写,如果输入大小写很重要,您可以在从表单收到数据后进行字符串到小写的转换。如果它们在Facebook或Microsoft工作,该怎么办?还是在雅虎工作?您拒绝他们使用他们的工作电子邮件,而这正是您所要求的。@Martin我正在使用HTML5模式属性来阻止用户在表单字段中输入免费电子邮件帐户。因此,在用户提交表单以使用HTML5验证之前,需要转换为小写。我想我可以把它应用到模糊上。虽然这不是对所问问题的技术性回答,但我完全同意(如上评论所述)得出结论的要点理由。因此,令人烦恼的是,我想-1表示不是代码解决方案答案,而是+1表示逻辑推理+1赢了,只是…@Martin我不确定一个好的答案必须是b