【问题标题】:Regex email special character validation正则表达式电子邮件特殊字符验证
【发布时间】:2018-01-25 11:01:18
【问题描述】:

我需要一个带有特殊字符的正则表达式电子邮件验证。

规则:

  • 本地部分可能有 2 个或更多字符长度
  • 本地部分包含特殊字符 & 可能不会以特殊字符开头和结尾。
  • 在@之后只允许 a-z-A-Z0-9

当前正则表达式:

^[a-zA-Z0-9]+([\w\.\'\!\#\$\%\&\*\+\-\/\=\?\^\`\{\|\}\~])+([a-zA-Z0-9])+@(([a-zA-Z0-9\.\-])+.)+([a-zA-Z0-9]{2,8})+$

测试模式:

eee123@eee.eee > TRUE
e#e@eee.eee > TRUE
e#2@eee.eee > TRUE
ee@eee.eee > FALSE
e2@eee.eee > FALSE
#e@eee.eee > FALSE
e#@eee.eee > FALSE

我需要一个将验证为的正则表达式:

eee123@eee.eee > TRUE
e#e@eee.eee > TRUE
e#2@eee.eee > TRUE
ee@eee.eee > TRUE
e2@eee.eee > TRUE
#e@eee.eee > FALSE
e#@eee.eee > FALSE

【问题讨论】:

  • local part contain special character & might not start & end with special character. 这个规则与你的例子相矛盾:ee@eee.eee > TRUE e2@eee.eee > TRUE 如果应该有一个特殊的字符,那些应该是假的
  • 是的,正如你所说,ee@eee.eee > TRUE, e2@eee.eee > TRUEe#@eee.eee > FALSE, #e@eee.eee > FALSE。有没有可能
  • 您可能应该首先使用filter_var() 验证电子邮件地址,然后使用正则表达式仅检查@ 之前的部分是否有额外的特殊条件...
  • 这是一个不错的技巧。但是仅使用正则表达式就可以吗?可能会更好。
  • 能否避免特殊字符出现在@ 之后。在@ 之后只允许a-z-A-Z0-9。可以修改

标签: php regex validation


【解决方案1】:
^[a-zA-Z0-9]+([\w\.\'\!\#\$\%\&\*\+\-\/\=\?\^\`\{\|\}\~])*([a-zA-Z0-9])+@([a-zA-Z0-9]+\.)+[a-zA-Z0-9]{2,8}$

只需将 + 替换为 * 或 ?在([\w\.\'\!\#\$\%\&\*\+\-\/\=\?\^\{\|}\~])` 之后,它将符合您的预期。 根据需要更新。

【讨论】:

  • 那是一个不错的选择。您能否避免在@ 之后出现特殊字符。在@ 之后只允许a-z-A-Z0-9。可以修改
  • @Sinto,更新,可以吗?只是从你的更新:)
  • 正则表达式是邪恶的,永远不要使用它
【解决方案2】:

虽然您有答案,但请注意您不必在方括号中转义所有内容,意思是:

^
[a-zA-Z0-9]+
([-.'!#$%&*+-\/=?^`{|}~]*)
([a-zA-Z0-9])+
@
([a-zA-Z0-9]+\.)+
[a-zA-Z0-9]{2,8}
$

做同样的事情并且到目前为止更具可读性。此外,* 应该是 in 括号。


作为旁注,我宁愿使用像\S+@\S+ 这样更简单的表达式,并且实际上尝试向该地址发送电子邮件 - 电子邮件地址往往比以前想象的更复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2014-05-11
    相关资源
    最近更新 更多