检查一个string是否是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"); 

没有正则expression式:

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

最简单的方法是使用正则expression式来检查电子邮件地址,虽然有一些不同意见,可能会有多精确。 这个过程在这里详细讨论:

使用正则expression式来validation电子邮件地址

你可以在MySQL中使用REGEXP从数据库中select你的正则expression式:

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

您可以使用正则expression式来validation您的inputstring,以查看它是否与电子邮件地址匹配:

 <?php $email = "someone@example.com"; if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[az]{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

编辑 :为了更准确的expression,请参考Travis在这个问题上的答案

这个函数is_email()会给你一个明确的答案,确定该string是否是一个有效的电子邮件地址。 据我所知,没有其他的解决scheme能够以同样的权威来做到这一点。

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

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

PHP内置函数不完整。 我是is_email()的主要作者,所以我在这里吹了自己的小号,但是我已经做了很多的工作,以使其他人不必再一次。

我已经在数百个网站上使用了这个function。 这可能不是完美的,但我从来没有一个错误的否定(或积极)投诉:

 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; } 
 $user_email = "email@string.com"; function isEmail($user) { if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[az]{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"); } 

因为每个人都发表他们的正则expression式,所以我的是: ^((([\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规范中的所有内容,包括大多数人通常不包括的许多事情。

除了大多数不支持所有可用顶级域名(包括例如.info.museum )的正则expression式build议和即将通过的允许中文和阿拉伯语在URL中的决定(这会让[az]\w失败)为此,下面更通用的正则expression式就足够了

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

我还会提到,做一个WHERE user=test OR user=test@example.com太容易出错。 更好地在表中使用自动生成的PK,并在WHERE子句中使用它。

我真的没有看到符合RFCxxxx规范的严格,长期和不可读的mailregexes的价值。 最好的办法是发送一封带有激活码的链接的邮件给最终用户,让它确认邮件地址。 通知那个表格。 如有必要,让用户像input密码一样键入电子邮件地址两次。

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

 function checkEmail($email) { if ( strpos($email, '@') !== false ) { $split = explode('@', $email); return (strpos($split['1'], '.') !== false ? true : false); } else { return false; } } $email = 'my@email.com'; $check = checkEmail('my@email.com'); if ( $check ) { echo $email . ' looks like a valid 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.'; } 
 $user_email = "email@gmailcom"; function isEmail($email) { if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[az]{2,3})$", $email)) { return true; } else { return false; } } if (isEmail($user_email)) { // email is ok! } else { // email not ok }