检查字符串是否是 PHP 中的电子邮件地址

我试图做一个 SQL 查询,但我需要检查某种方式,如果值是一个电子邮件地址。 我需要一种方法来检查 $user是否是一个电子邮件地址,因为我的表中有这样的用户值。

test
test2
test@example.com
test2@example.com
test392
test@example.net

诸如此类。

我需要使它这样 $useremail检查 $user,以查找它是否是一个电子邮件地址。因此,我可以更新值,WHERE user=test OR user=test@example.com等。

$user = strtolower($olduser);
$useremail = "";


mysql_query("UPDATE _$setprofile SET user=$sn, fc=$fc WHERE user='$user' OR user='$useremail");
106029 次浏览

最简单的方法是使用正则表达式检查电子邮件地址,尽管对于这种方法的准确性存在一些分歧。这里将详细讨论这一过程:

使用正则表达式验证电子邮件地址

可以在 MySQL 中使用 REGEXP 根据正则表达式从数据库中进行选择:

Http://dev.mysql.com/doc/refman/5.1/en/regexp.html

您可以使用正则表达式来验证您的输入字符串,以查看它是否与电子邮件地址匹配:

<?php
$email = "someone@example.com";
if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) {
echo "Valid email address.";
}
else {
echo "Invalid email address.";
}
?>

来自: Http://www.totallyphp.co.uk/code/validate_an_email_address_using_regular_expressions.htm

编辑 : 关于这个问题,请参考 Travis 回答以获得更准确的表达

没有正则表达式:

<?php
if(filter_var("some@address.com", FILTER_VALIDATE_EMAIL)) {
// valid address
}
else {
// invalid address
}
?>
$email = "email@string.com";


function isEmail($email) {
if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) {
return true
} else {
return false
}
}


if (isEmail($user_email)) {
// email is valid, run the query
mysql_query("UPDATE _$setprofile SET user=$sn, fc=$fc WHERE user='$user' OR user='$user_email");
}

我已经在数百个网站上使用这个函数很多年了。这可能并不完美,但是我从来没有听到过关于错误的否定(或者肯定)的抱怨:

function validate_email($email) {
return (preg_match("/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/", $email) || !preg_match("/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email)) ? false : true;
}

除了所有的正则表达式建议,大多数不支持 所有的可用 TLD 的(包括例如 .info.museum)和即将到来的 ICANN 的决定,允许中文和阿拉伯语的 URL 的(这将让 [a-z]\w失败) ,以下更通用的正则表达式是足够的

([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)

我还要提到的是,执行 WHERE user=test OR user=test@example.com是非常容易出错的。最好在表中使用自动生成的 PK,并在 WHERE子句中使用它。

我实在看不出符合 RFCxxxx 规范的严格、冗长和不可读的邮件正则表达式有什么价值。最好的方法仍然是向最终用户发送带有激活键的链接的邮件,以便用户确认邮件地址。在表格里也写上。如果有必要,让用户键入两次电子邮件地址,就像您对密码所做的那样。

因为每个人都在发布他们的正则表达式,这是我的: ^((([\w+-]+)(.[\w+-]+)*)|(\"[^(\|\")]{0,62}\"))@(([a-zA-Z0-9-]+.)+([a-zA-Z0-9]{2,})|[?([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})(.([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})){3}]?)$

据我所知,它支持 RFC 规范中的所有内容,包括许多大多数人通常不包括的内容。

这个函数 是 _ email ()会给你一个明确的答案,告诉你这个字符串是否是一个有效的电子邮件地址。据我所知,没有其他解决方案可以用同等级别的权威来做到这一点。

如果我正确理解了这个例子,您就会像这样使用它

$user = strtolower($olduser);
$useremail = (is_email($user)) ? $user : '';

PHP 内置函数不完整。我是 is_email()的主要作者,所以我在这里自吹自擂,但我已经投入了大量的工作,以便没有人应该再次不得不这样做。

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo 'This is a valid email address.';
echo filter_var($email, FILTER_VALIDATE_EMAIL);
// exit("E-mail is not valid");
}
else {
echo 'Invalid email address.';
}

这不是一个很好的方法,不检查电子邮件是否存在,但它检查它是否看起来像一个电子邮件与@和域扩展名。

function checkEmail($email) {
$find1 = strpos($email, '@');
$find2 = strpos($email, '.');
return ($find1 !== false && $find2 !== false && $find2 > $find1);
}


$email = 'name@email.com';
if ( checkEmail($email) ) {
echo $email . ' looks like a valid email address.';
}
$user_email = "email@gmailcom";


function isEmail($email) {
if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) {
return true;
} else {
return false;
}
}


if (isEmail($user_email)) {
// email is ok!
} else {
// email not ok
}