我正在尝试创建一个验证语法和MX Record的脚本,以了解电子邮件是否正确。
但由于某种原因,这是不正确的。
有什么想法吗?
我的TXT文件:
email@facebook.com
email@gmail.com
asdhiadf@fdfsdf.com
我的PHP代码:
$fh = fopen('emails.txt','r');
while ($line = fgets($fh)) {
// Create the syntactical validation regular expression
$regexp = "^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$";
// Presume that the email is invalid
$valid = 0;
// Validate the syntax
if (eregi($regexp, $line))
{
list($username,$domaintld) = split("@",$line);
// Validate the domain
if (getmxrr($domaintld,$mxrecords)) {
echo(1) . "--> " . $line . "<br />";
}
else {
echo (-1) . "--> " . $line . "<br />";
}
} else {
echo(0) . "--> " . $line . "<br />";
}
}
fclose($fh);
答案 0 :(得分:2)
除了您应该考虑的问题下面的所有评论之外,代码失败的原因还在于fgets()
。
当你用fgets()
读取一行时,除了最后一行之外,每一行末尾都会有一个换行符,所以你的正则表达式和filter_var()
都会失败,除了最后一行电子邮件地址(如果您之后没有空行......)。
要解决当前问题,您需要:
while ($line = fgets($fh)) {
$line = trim($line);
答案 1 :(得分:2)
您遇到此问题的原因是每行末尾的\n
字符。
尝试将其删除:
while ($line = fgets($fh)) {
$line = substr($line, 0,-1);
答案 2 :(得分:1)
使用preg_match
评估正则表达式,并使用explode
进行拆分
if(preg_match("/^([_a-z0-9-])([\._a-z0-9-]+)*@([a-z0-9-])([\.a-z0-9-]+)*(\.[a-z]{2,4})$/"),trim($email)){
explode("@",$email);
}