【问题标题】:Regular expression for email addresses before @ symbol@ 符号前的电子邮件地址的正则表达式
【发布时间】:2014-12-17 14:23:53
【问题描述】:

我想要一个正则表达式来检查用户电子邮件地址的第一部分(@符号之前)。

只有字符数字和“.”符号有效。我尝试了一些方法,但还不够。

这是我的表达,但问题是用户可以提交多个点,例如“example..test”、“ex...amp..le”。

"/^[a-zA-Z0-9.]+$/"

编辑:我不想允许下划线或类似的东西。

【问题讨论】:

  • 为什么不用连字符?那些有什么问题?下划线呢?
  • 您要允许单个点吗?如果是,那么试试"/^[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/"
  • 你可以使用filter_var()FILTER_VALIDATE_EMAIL;为什么要自己动手呢?毕竟,只有在向其发送电子邮件成功(通常)时才能验证电子邮件地址

标签: php regex


【解决方案1】:

您的具体情况

要禁止重复字符,您可以使用否定断言:

if (preg_match('/(?!.*\.\.)^[a-z0-9.]+$/', $inbox_name)) {
    // valid, probably
}

这允许句点作为第一个字符,但电子邮件地址中不允许使用句点,因此您必须进一步完善它:

if (preg_match('/(?!.*\.(\.|$))^[a-z0-9][a-z0-9.]*$/', $inbox_name)) {
    // valid, probably
}

解释:

  1. 不允许句号后跟另一个句号或主题结尾;
  2. 字符串必须以字母或数字开头;
  3. 起始字符后面可以跟字母、数字或句点。

旧答案

使用filters 而不是尝试滚动您自己的电子邮件地址验证:

var_dump(filter_var('ex..ample@example.org', FILTER_VALIDATE_EMAIL)); 
// bool(false)

var_dump(filter_var('ex.ample@example.org', FILTER_VALIDATE_EMAIL)); 
// string("ex.ample@example.org")

在您尝试发送电子邮件之前,您仍然无法保证该电子邮件地址确实有效(即使这样也可能是误报)。

我不想允许下划线或类似的东西。

这个论点是荒谬的;它们在电子邮件地址中有效,除了个人喜好之外,您真的没有理由阻止它。

【讨论】:

  • 我无法到达第二部分的电子邮件地址。我正在编写一个网络服务方法,它只检查电子邮件地址的第一部分是否有效。
  • @hellzone 然后,如果您只想验证收件箱名称,只需在验证之前附加@example.org
  • 我已经编辑了我的问题以显示我真正想要的。所以过滤器不适合我“只有字符数字和“。”符号有效”。
  • @hellzone 嗯,你试过像/(?!.*\.\.)^[a-z0-9.]+$/这样的东西吗?
【解决方案2】:
^(?=[^.]*\.[^.]*$)[a-zA-Z0-9.]+$

你可以试试这个。这将只允许一个.

$re = "/^(?=[^.]*\\.[^.]*$)[a-zA-Z0-9.]+$/m";
$str = "asdasd.asdasd.\nasdsad.asdasd\nasdsadsad.asdasd.sa.d.";

preg_match_all($re, $str, $matches);

【讨论】:

    【解决方案3】:

    你可以试试这个

    '/^[a-zA-Z0-9]+\.?[a-zA-Z0-9]+@/'
    

    以下是一些输出:

    $a = "sf..sf@g.com"
    var_dump( preg_match('/^[a-zA-Z0-9]+\.?[a-zA-Z0-9]+@/', $a));
    int(0)
    $b = "sf.sf@g.com";
    var_dump( preg_match('/^[a-zA-Z0-9]+\.?[a-zA-Z0-9]+@/', $b));
    int(1)
    $c = "sff.@g.com";
    var_dump( preg_match('/^[a-zA-Z0-9]+\.?[a-zA-Z0-9]+@/', $c));
    int(0)
    $d = "sff..@g.com";
    var_dump( preg_match('/^[a-zA-Z0-9]+\.?[a-zA-Z0-9]+@/', $d));
    int(0)
    $e = "adeade@g.com";
    var_dump( preg_match('/^[a-zA-Z0-9]+\.?[a-zA-Z0-9]+@/', $e));
    int(1)
    $f = "a.b.c@g.com";
    var_dump( preg_match('/^[a-zA-Z0-9]+\.?[a-zA-Z0-9]+@/', $f));
    int(0)
    

    【讨论】:

    • 它无法匹配"a.b.c@example.org"
    【解决方案4】:

    试试这个:

    "/^[a-zA-Z0-9]+(\.[a-zA-Z0-9_-]+)*$/"
    

    必须支持Hyphensunderline,并且电子邮件必须首先以alphanumeric character 开头。

    【讨论】:

    • 修改了正则表达式,不再像您的示例中那样允许双点。
    • 再次修改以修复 Jacks 示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多