我有这个功能来验证一个电子邮件地址:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
这样可以检查电子邮件地址是否有效吗?
我有这个功能来验证一个电子邮件地址:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
这样可以检查电子邮件地址是否有效吗?
当前回答
看完这里的答案后,我得出了以下结论:
public static function isValidEmail(string $email) : bool
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
//Get host name from email and check if it is valid
$email_host = array_slice(explode("@", $email), -1)[0];
// Check if valid IP (v4 or v6). If it is we can't do a DNS lookup
if (!filter_var($email_host,FILTER_VALIDATE_IP, [
'flags' => FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE,
])) {
//Add a dot to the end of the host name to make a fully qualified domain name
// and get last array element because an escaped @ is allowed in the local part (RFC 5322)
// Then convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
$email_host = idn_to_ascii($email_host.'.');
//Check for MX pointers in DNS (if there are no MX pointers the domain cannot receive emails)
if (!checkdnsrr($email_host, "MX")) {
return false;
}
}
return true;
}
其他回答
/(?![[:alnum:]]|@|-|_|\.)./
现在,如果你使用带有type=email的HTML5表单,那么你已经有80%的安全性了,因为浏览器引擎有它们自己的验证器。为了补充它,将这个正则表达式添加到你的preg_match_all()并对其求反:
if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }
找到HTML5表单使用的正则表达式进行验证 https://regex101.com/r/mPEKmy/1
这不仅可以验证你的邮件,还可以过滤掉意想不到的字符:
$email = $_POST['email'];
$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);
if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false ||
$emailB != $email
) {
echo "This email adress isn't valid!";
exit(0);
}
的Python和PHP实现 正确验证任何电子邮件地址,即 邮件服务器确认是真的 域是实的。
在GPL-3.0许可下发布。
就是这样:
https://lja.fi/index.php/github-stuff/
--李雅
根据我的经验,regex解决方案有太多的假阳性,而filter_var()解决方案有假阴性(特别是对于所有新的tld)。
相反,最好是确保地址具有电子邮件地址的所有必需部分(用户、“@”符号和域),然后验证域本身是否存在。
无法确定(服务器端)外部域是否存在电子邮件用户。
这是我在Utility类中创建的一个方法:
public static function validateEmail(string $email): bool {
// SET INITIAL RETURN VARIABLE
// ENSURE -> EMAIL ISN'T EMPTY | AN @ SYMBOL IS PRESENT
$emailIsValid = FALSE;
if (
!empty($email) &&
strpos($email, '@') !== FALSE
) {
// GET EMAIL PARTS
$email = explode('@', $email);
$user = $email[0];
$domain = $email[1];
// VALIDATE EMAIL ADDRESS
if (
count($email) === 2 &&
!empty($user) &&
!empty($domain) &&
checkdnsrr($domain)
) {
$emailIsValid = TRUE;
}
}
// RETURN RESULT
return $emailIsValid;
}
如果你只是在寻找一个实际的正则表达式,允许各种点,下划线和破折号,它如下:[a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+。这将允许像tom_anderson.1-neo@my-mail_matrix.com这样看起来相当愚蠢的电子邮件被验证。