PHP preg_match邮箱验证问题

10
我正在使用PHP中的preg_match函数验证电子邮件地址。但我一直收到以下错误:
preg_match(): No ending delimiter '^' found

这是我的 preg_match 模式。

$pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$";

如何解决这个问题?

9个回答

29

只需使用:

$pattern = "/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i";

2
这并不完全有效,因为您可以发送电子邮件至Martin.Kudlacek@example.com,而您的模式会说此地址无效。这种情况刚好发生在我使用MS Exchange时,它会创建此类电子邮件地址。 - mkudlacek
@mkudlacek 在应用模式之前,您需要将电子邮件转换为小写。 - Shoe
1
这不是对原问题的回答。问题是如何使用preg_match()进行验证。正确的模式应该是:/^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)(.[a-zA-Z]{2,})$/ 或者扩展为/i以进行大小写不敏感匹配。 - mkudlacek
1
@mkudlacek 好的,没问题。我已经在末尾添加了 i - Shoe

16

也许可以使用

filter_var($email, FILTER_VALIDATE_EMAIL);

这将是一种更简便的方法。


3
使用 filter_var 函数验证电子邮件时要注意 IDN 域名。例如,这些有效的电子邮件地址: путин@президент.рф 或 用户@例子.广告,会被视为不正确。您需要使用 idn_to_ascii() 函数来进行转换处理。 - Sergey Bogdanov

8
使用这段代码。
<?php
 $email = "asd/sdff@asdf.com"; 
 $regex = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/'; 
 $email = (preg_match($regex, $email))?$email:"invalid email";
?>

这与像.agency这样的域名不匹配。 - Rees McIvor

1

更新了模式,现在也允许像name.surname+t3st@gmail.com这样的地址。

$pattern = "/^[_a-z0-9-+]+(\.[_a-z0-9-+]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i";

1

由于FILTER_VALIDATE_EMAIL存在问题(例如,它与非拉丁字符的兼容性不佳),我更喜欢使用:

preg_match("/^[^@]+@[^@]+\.[a-z]{2,6}$/i",$email_address);


0

这是一个使用正则表达式的简单电子邮件验证方法:

public function emailValidation($email) 
{
    $regex = "/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,10})$/";
    $email = strtolower($email);

    return preg_match ($regex, $email);
}

0

在PHP中使用filter_var()函数只有当邮件管理员想要允许RFC样式匹配电子邮件地址时才会更容易。对于某些应用程序或MTAs(如sendmail等),这可能不是理想的选择。但是,如果要走preg_match()路线,我建议调查非贪婪量词和不使用缓冲区的捕获语句。一个好的起点是http://us3.php.net/manual/en/book.pcre.php


0
只需在 $ 结尾添加 "^" 即可:
$pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$^";

-2
    var emailid = $.trim($('#emailid').val());  
  if( ! /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(emailid)){
                alert("<?php echo "email_invalid" ?>");

                return false;
            }

emailid是输入标签的id


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接