function isValidEmail($email){
$pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$";
if (eregi($pattern, $email)){
return true;
}
else {
return false;
}
}
,但它显示了已弃用的错误。我该如何解决此问题。请帮帮我。
#1 楼
您可以使用filter_var()
函数,该函数为您提供了许多方便的验证和清理选项。filter_var($email, FILTER_VALIDATE_EMAIL)
PHP手册filter_var()
可用在PHP> = 5.2.0
中,如果您不想更改依赖函数的代码,只需执行以下操作:
function isValidEmail($email){
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
注意:对于其他用途(需要Regex的情况),应使用
ereg
系列(PCRE Regex函数)代替已弃用的preg
函数族(POSIX Regex函数)。差异很小,阅读本手册就足够了。更新1:@binaryLV指出:
PHP 5.3.3和5.2 .14存在与
FILTER_VALIDATE_EMAIL相关的错误,该错误导致在验证
大值时出现段错误。为此,简单安全的解决方法是在
strlen()
之前使用filter_var()
。我不确定5.3.4最终版,但是据信
某些5.3.4快照版本也受到了影响。
此错误已得到修复。
更新2:此方法当然会将
bazmega@kapa
验证为有效的电子邮件地址,因为实际上它是有效的电子邮件地址。但是大多数时候,在Internet上,您还希望电子邮件地址具有TLD:bazmega@kapa.com
。如本博文(@Istiaque Ahmed发布的链接)所建议的那样,您可以使用正则表达式来增强filter_var()
,该正则表达式将检查域部分中是否存在点(尽管不会检查有效的TLD):function isValidEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL)
&& preg_match('/@.+\./', $email);
}
正如@Eliseo Ocampos指出的那样,此问题仅在PHP 5.3之前存在,在该版本中,他们更改了正则表达式,现在它进行了此检查,因此您不必这样做。 br />
评论
+1也就是说,您可能要提及的是,此功能仅在PHP 5.2.x及更高版本中可用。 :-)
–约翰·帕克
2011年5月2日在10:09
@middaparka:随着OP收到关于eregi的已弃用消息,看来他正在使用PHP 5.3。但是,是的(对其他人来说)很重要。
–费利克斯·克林(Felix Kling)
2011年5月2日,10:10
PHP 5.3.3和5.2.14有一个与FILTER_VALIDATE_EMAIL有关的bug(bugs.php.net/52929),当验证大值时会导致segfault。一个简单而安全的解决方法是在filter_val()之前使用strlen()。我不确定5.3.4最终版,但据信某些5.3.4快照版本也受到了影响。
–binaryLV
2011年5月2日在10:39
@ binaryLV,filter_val或filter_var吗?
–艾斯提克·艾哈迈德(Istiaque Ahmed)
2012年11月21日,9:31
@kapa,实际上,您无需再检查域部分中的点。参见svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/filter / ...
– Eliseo Ocampos
2013年12月9日21:21
#2 楼
请参见http://www.php.net/manual/zh-CN/function.ereg.php上的说明:Note:
自PHP 5.3起。 0,不赞成使用正则表达式扩展名,而推荐使用PCRE扩展名。调用此
函数将发出E_DEPRECATED
通知。请参阅差异列表
,以获取转换为PCRE的帮助。
Note:
preg_match(),它使用与Perl兼容的正则表达式
语法,通常是ereg()的更快替代方法。
#3 楼
这是旧帖子,但我将分享我的解决方案,因为之前没有人提到一个问题。新电子邮件地址可以包含UTF-8字符或特殊域名,例如
.live
,.news
等。我还发现某些电子邮件地址可能位于Cyrilic上,并且在所有情况下,标准正则表达式或
filter_var()
都会失败。这就是我为此提出解决方案的原因:
function valid_email($email)
{
if(is_array($email) || is_numeric($email) || is_bool($email) || is_float($email) || is_file($email) || is_dir($email) || is_int($email))
return false;
else
{
$email=trim(strtolower($email));
if(filter_var($email, FILTER_VALIDATE_EMAIL)!==false) return $email;
else
{
$pattern = '/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD';
return (preg_match($pattern, $email) === 1) ? $email : false;
}
}
}
此功能适用于所有情况和电子邮件格式。
#4 楼
我总是这样使用:function validEmail($email){
// First, we check that there's one @ symbol, and that the lengths are right
if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {
// Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
return false;
}
// Split it into sections to make life easier
$email_array = explode("@", $email);
$local_array = explode(".", $email_array[0]);
for ($i = 0; $i < sizeof($local_array); $i++) {
if (!preg_match("/^(([A-Za-z0-9!#$%&'*+\/=?^_`{|}~-][A-Za-z0-9!#$%&'*+\/=?^_`{|}~\.-]{0,63})|(\"[^(\|\")]{0,62}\"))$/", $local_array[$i])) {
return false;
}
}
if (!preg_match("/^\[?[0-9\.]+\]?$/", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
$domain_array = explode(".", $email_array[1]);
if (sizeof($domain_array) < 2) {
return false; // Not enough parts to domain
}
for ($i = 0; $i < sizeof($domain_array); $i++) {
if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) {
return false;
}
}
}
return true;
}
评论
@unbreak我尝试了您的代码,发现如果您以alex @的身份通过电子邮件,则会发现该错误。那么它在无效的电子邮件地址中始终返回true。
– Subhajit
18年4月11日在11:35
#5 楼
远离regex
和filter_var()
解决方案来验证电子邮件。查看此答案:https://stackoverflow.com/a/42037557/953833 #6 楼
使用:http://php.net/manual/en/function.filter-var.php中的或“ filter_var”
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
或来自https://github.com/egulias/EmailValidator的“ EmailValidator”
$validator = new EmailValidator();
$multipleValidations = new MultipleValidationWithAnd([
new RFCValidation(),
new DNSCheckValidation()
]);
$validator->isValid("example@example.com", $multipleValidations); //true
#7 楼
用户数据对于一个好的开发人员来说非常重要,因此不要再询问
,对于相同的数据,请使用一些逻辑来纠正数据中的一些基本错误。
在验证电子邮件之前:首先,您必须从电子邮件中删除所有非法字符。
//This will Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
之后,请使用此
filter_var()
函数验证您的电子邮件地址。filter_var($email, FILTER_VALIDATE_EMAIL)) // To Validate the email
例如
<?php
$email = "john.doe@example.com";
// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
// Validate email
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo $email." is a valid email address";
} else {
echo $email." is not a valid email address";
}
?>
评论
已经给出了正确的答案,但是关于不建议使用的问题:不建议使用POSIX正则表达式(eregi是其功能)。请改用PCRE。顺便说一句,您的正则表达式是完全错误的。您的功能会将某些完全有效的地址标记为无效。使用正则表达式过滤电子邮件地址是一场噩梦。
您应该使用RFC 822标准,这是一篇很好的文章,用PHP解析电子邮件地址对此进行了说明。