【问题标题】:Regular expression not to allow whitespace at the end of email正则表达式不允许电子邮件末尾有空格
【发布时间】:2017-12-29 10:12:28
【问题描述】:

我正在尝试接受一封电子邮件,但最后没有空格或空白。 我尝试了两种变体

pattern="^[A-Za-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{1,4}[^\s]+$" >

pattern="^[A-Za-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{1,4}\S$">

两者都不起作用,输入最后接受空格。我的完整输入行是

input type="email" id="guestUserEmail" name="guestEmail" data-pattern-error="Email 无效" data-required-error="请输入电子邮件地址" required pattern="^[A- Za-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{1,4}$"

我参考了这个答案regex for no whitespace at the begining and at the end but allow in the middle

请推荐!

【问题讨论】:

  • 最后用*$代替+$
  • 您也可以这样做,首先使用trim() 函数修剪该电子邮件String,然后应用正则表达式。
  • @ArvindKatte 我已经厌倦了使用 * & + 或者两者都不起作用。关于修剪,我确实建议过,但具体要求是在最后添加空间时显示错误。我无法理解为什么 ^\s 或 \S 不起作用
  • 使用这个^[A-Za-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{1,4}[^\\S]+$ 它对我有用
  • 域名部分无法在 TLD 中使用破折号。 localpart 拒绝 * 和毫无疑问的其他一些允许的字符。这两个部分显然都无法处理国际化的电子邮件地址,尽管这很可能超出了这里的范围。 emailregex.com 有一个相当全面的测试套件,尽管它还涵盖了在电子邮件 From: 标头中编码 cmets、真实姓名和其他装饰的方式的变化。

标签: regex validation email


【解决方案1】:

更新

HTML 默认折叠空白。这意味着:

  • 如果字符之间有多个空格,它将呈现为单个空格字符。

    • ex.this string has a double space right here .
      将呈现为:
      this string has a double space right here .
  • 前导和尾随空格被去除(字符串不会发生这种情况,因此需要trim()等方法)

    • 例如。 abc123@email.com   
      将呈现为:
      abc123@email.com

因此,如果您的电子邮件地址后面有十亿个空格,它将被自动剥离为 <input>。该演示将您的<input> 包裹在<form> 中,表单实际上会将数据发送到真实的测试服务器。如果您发送带有尾随空格的有效电子邮件地址,请查看回复。您会在响应中看到该值没有尾随空格。


您是否考虑过逃避经期?

. 表示 ANY 一个字符

\. 表示点或句点

看起来像这样:

[A-Za-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{1,4}\S$

RegEx101查看测试


演示

input {
  font: inherit
}
<form id='contact' action='https://httpbin.org/post' method='post'>
  <input type="email" id="guestEmail" name="guestEmail" pattern="^[A-Za-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{1,4}$" required placeholder='abc123@email.com'>
  <input type='submit'>
</form>

【讨论】:

  • 它在提供的链接中工作正常,但我不知道它对我的 html 有帮助
  • 是的...我进行了 6 次测试,其中前三个应该是有效的电子邮件地址,而其他三个是无效的电子邮件地址,通过了无效。你有没有被这 6 个测试覆盖的模式?
  • 我正在尝试使用电子邮件 test@gmail.com 并且它没有抛出错误,这意味着最后的 /S 部分不起作用
  • 字符类中的点只是文字点。
  • @tripleee 是的,我的观点完全正确。如果您不转义点,abc@emailXcom 将与 abc@email.com 相同。
【解决方案2】:

Java 转义序列不会考虑\,您必须再附加一个斜线,例如\\

修改你的字符串模式,像这样

^[A-Za-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{1,4}[^\\S]+$

这将解决,

【讨论】:

  • 我试过了,它检测到空格并抛出错误,但现在它已停止检测范围 {1,4} 并且在“。”之后接受“n”个字符
【解决方案3】:

我认为你的正则表达式没问题:

https://regex101.com/r/j0MXV5/1

https://regex101.com/r/oN9v8U/1

也许可以选择使用blur 并修剪前导和尾随空格:

onblur="this.value=this.value.trim();

或者只有尾随空格:

onblur="this.value=this.value.replace(/\s+$/, '');

<form>
    <input type="email" id="guestUserEmail" name="guestEmail" data-pattern-error="Email is invalid" data-required-error="Please enter email address" required pattern="^[A-Za-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{1,4}[^\\S]+$" onblur="this.value=this.value.replace(/\s+$/, '');">
</form>

【讨论】:

  • 此选项有效,但给我的具体要求是在电子邮件后添加的空白或空白处显示错误消息。
【解决方案4】:

您正在使用 email 类型的 HTML input 字段。此元素的defined and documented behavior接受但删除任何前导或尾随空格。如果这不可接受,请不要使用此元素。

您“修复”正则表达式的尝试被误导了。基本的正则表达式阅读技巧应该告诉你,明显的原始正则表达式只允许字符串结尾之前的字母。您的尝试基本上会将其从“几乎正确的电子邮件”更改为“几乎正确的电子邮件,然后是任何垃圾邮件,只要它不是空格”。

一般来说,您可以通过对它进行更多约束来修复过于宽松的正则表达式(删除一些它以前会接受的东西,也许会在此过程中重构正则表达式;例如,要在域部分中只允许内部破折号,您必须将其拆分为第一个字符,可选的中间字符(可能带有破折号),可选的最后一个字符(不带破折号)稍少),但肯定不是通过添加新的匹配可能性——尤其不是一个广泛的通用字符类重复任意次数。

正如 cmets 中已经指出的那样,没有办法将每个有效的电子邮件地址与正则表达式完全匹配,但 HTML5 中的常规内置验证几乎可以保证比您在某些网站上找到的随机正则表达式做得更好PHP 论坛。

【讨论】:

  • 感谢您的链接和输入。
【解决方案5】:

使用这个正则表达式。 它将验证您的电子邮件在电子邮件 ID 的开头或结尾是否带有空格

^([^\S/.]{0,})+(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})+([^\S/.]{0,})$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2019-11-24
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多