70

我正在尝试执行 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");
4

11 回答 11

254

没有正则表达式:

<?php
    if(filter_var("some@address.com", FILTER_VALIDATE_EMAIL)) {
        // valid address
    }
    else {
        // invalid address
    }
?>
于 2009-11-12T22:45:41.963 回答
11

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

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.';
}
于 2013-08-04T00:15:56.920 回答
10
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.';
} 
于 2013-04-07T13:03:24.237 回答
8

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

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

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

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

于 2009-11-12T22:42:30.343 回答
6

这个函数is_email()会给你一个明确的答案来判断这个字符串是否是一个有效的电子邮件地址。据我所知,没有其他解决方案能够以相同级别的权限做到这一点。

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

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

PHP 内置函数不完整。我是主要作者,is_email()所以我在这里吹响自己的号角,但我已经为此付出了很多努力,以便其他人不再需要这样做。

于 2010-09-13T11:25:05.303 回答
4

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

<?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对此问题的回答

于 2009-11-12T22:42:43.130 回答
3

多年来,我一直在数百个站点中使用此功能。它可能并不完美,但我从未抱怨过假阴性(或阳性):

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;
}
于 2009-11-12T22:49:16.823 回答
3

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

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

我还要提到做 aWHERE user=test OR user=test@example.com太容易出错了。最好在表中使用自动生成的 PK 并在WHERE子句中使用它。

我并没有真正看到符合 RFCxxxx 规范的严格、冗长和不可读的邮件正则表达式的价值。最好的方法仍然是向最终用户发送一封带有激活密钥链接的邮件,让其确认邮件地址。也以表格形式告知。如有必要,让用户像输入密码一样输入两次电子邮件地址。

于 2009-11-12T22:54:04.540 回答
3

由于每个人都在发布他们的正则表达式,这是我的: ^((([\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 规范中的所有内容,包括大多数人通常不包含的许多内容。

于 2009-11-12T22:54:58.503 回答
2
$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");
}
于 2009-11-12T22:46:15.237 回答
0
$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
}
于 2017-08-23T19:40:17.260 回答