如何使用php5验证输入值是否为有效的电子邮件地址。现在我正在使用此代码
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;
}
}
但它显示了已弃用的错误。我该如何解决这个问题。请帮帮我。
答案 0 :(得分:264)
您可以使用filter_var()
功能,它为您提供了许多方便的验证和清理选项。
filter_var($email, FILTER_VALIDATE_EMAIL)
PHP> = 5.2.0
如果您不想更改依赖于您的功能的代码,请执行以下操作:
function isValidEmail($email){
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
注意:对于其他用途(需要Regex的地方),已弃用的ereg
函数系列(POSIX正则表达式函数)应替换为preg
系列({{ 3}})。存在少量差异,阅读手册就足够了。
更新1 :正如PCRE Regex Functions所指出的那样:
PHP 5.3.3和5.2.14与@binaryLV有关 FILTER_VALIDATE_EMAIL,在验证时导致段错误 很大的价值。简单而安全的解决方法是使用
strlen()
在filter_var()
之前。我不确定5.3.4决赛,但确实如此 写道,一些5.3.4快照版本也受到影响。
此错误已得到修复。
更新2 :此方法当然会将bazmega@kapa
验证为有效的电子邮件地址,因为实际上它是有效的电子邮件地址。但大部分时间在互联网上,您还希望电子邮件地址具有TLD:bazmega@kapa.com
。正如此bug(由blog post发布的链接)中所建议的那样,您可以使用正则表达式来filter_var()
扩充,该正则表达式将检查域部分中是否存在点(不会检查有效 TLD):
function isValidEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL)
&& preg_match('/@.+\./', $email);
}
正如@Istiaque Ahmed指出的那样,这个问题只存在于PHP 5.3之前,@Eliseo Ocampos,现在它会进行检查,所以你不必这样做。
答案 1 :(得分:9)
请参阅http://www.php.net/manual/en/function.ereg.php上的说明:
Note:
从PHP 5.3.0开始,不推荐使用正则表达式扩展 PCRE extension。打电话给这个 函数将发出E_DEPRECATED 注意。见the list of differences 有关转换为PCRE的帮助。
Note:
preg_match(),它使用与Perl兼容的正则表达式 语法,往往是一个更快的选择 到ereg()。
答案 2 :(得分:6)
这是旧帖,但我会分享一个我的解决方案,因为之前没有提到过一个问题。
新电子邮件地址可以包含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;
}
}
}
此功能适用于所有案例和电子邮件格式。
答案 3 :(得分:3)
我总是使用这个:
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;
}
答案 4 :(得分:1)
远离regex
和filter_var()
解决方案以验证电子邮件。请参阅此答案:https://stackoverflow.com/a/42037557/953833
答案 5 :(得分:1)
使用:
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
$validator = new EmailValidator();
$multipleValidations = new MultipleValidationWithAnd([
new RFCValidation(),
new DNSCheckValidation()
]);
$validator->isValid("example@example.com", $multipleValidations); //true
答案 6 :(得分:1)
对于优秀的开发人员而言,用户数据非常重要,因此请勿再询问 对于相同的数据,再次使用一些逻辑来纠正数据中的一些基本错误。
验证电子邮件之前:首先,您必须从电子邮件中删除所有非法字符。
//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";
}
?>