【问题标题】:Regex Expressions: Filter Email addresses正则表达式:过滤电子邮件地址
【发布时间】:2012-01-25 13:14:51
【问题描述】:

我有以下正则表达式

/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/

当前与 -myemail-address@aasdf.com 形式的电子邮件地址匹配(不希望此电子邮件地址被接受,因为它以连字符开头) 如果我希望它拒绝以 - (连字符)开头的电子邮件地址,并且只接受以下划线 _ 开头的电子邮件地址,我将如何修改正则表达式?

修改正则表达式之前的另一个问题——电子邮件甚至可以以连字符开头吗?如果可以,那么修改正则表达式就没有意义了。

谢谢。

【问题讨论】:

  • “正则表达式”是“正则表达式”的缩写。 “正则表达式”因此意味着“正则表达式表达式”。
  • 我明白了。好的,我会记住的。
  • 如果你只想断言它以下划线开头,你可以在/^(?=_)开头使用断言(这将是结合检查到以下正则表达式模式)。
  • 标题需要改进。 :)

标签: php regex


【解决方案1】:

-hello-world@example.net 是一个有效的电子邮件地址。

来自RFC3696 Section 3: Restrictions on email addresses

local-parts 可以由任意字母组合组成 字符、数字或任何特殊字符

  ! # $ % & ' * + - / = ?  ^ _ ` . { | } ~

还可能有趣的是,“[句点] 不能用于开始或结束本地部分,也不能出现两个或多个连续句点。”

【讨论】:

    【解决方案2】:

    要了解是否允许带有前导 - 连字符的电子邮件地址,您可以使用更符合标准的正则表达式进行检查:

    print filter_var("-test@example.com", FILTER_VALIDATE_EMAIL);
    

    【讨论】:

    • 很好的建议。提醒一句:我会鼓励任何人使用它来运行他们自己的测试。具体来说,试试john.doe@localhost 之类的电子邮件。尽管这是一个有效的地址并且可以进行验证,但大多数网站都不愿意接受它。
    【解决方案3】:

    只需修复正则表达式的第一部分:

    /^[_a-zA-Z0-9]+(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/
    

    【讨论】:

    • 不确定他是否真的是这个意思,但“只接受以下划线_开头的那些”。
    • 是的,只接受以下划线_开头的电子邮件,但允许中间有连字符。
    【解决方案4】:
    /^[_a-zA-Z0-9]+(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/
    

    【讨论】:

    • oooo 我慢了 22 秒 :-P
    • 但是这个正则表达式不会接受 asdf-asdf@asd.com 形式的电子邮件,对吧?我仍然希望在这些电子邮件之间保留连字符,而不是在电子邮件地址的开头使用连字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多