criffoh at gmail dot com 是对的。在检查域名之前,您必须使用 idn_to_ascii 函数将其转换为 ASCII
http://us2.php.net/manual/en/function.idn-to-ascii.php .
var_dump(checkdnsrr('ñandu.cl', 'A')); // 返回 false
var_dump(checkdnsrr(idn_to_ascii('ñandu.cl'), 'A')); // 返回 true
(PHP 4, PHP 5, PHP 7, PHP 8)
checkdnsrr — 检查与给定互联网主机名或 IP 地址相对应的 DNS 记录
hostname
hostname
可以是点分十进制表示法的 IP 地址,也可以是主机名。
type
type
可以是以下任何一种:A、MX、NS、SOA、PTR、CNAME、AAAA、A6、SRV、NAPTR、TXT 或 ANY。
criffoh at gmail dot com 是对的。在检查域名之前,您必须使用 idn_to_ascii 函数将其转换为 ASCII
http://us2.php.net/manual/en/function.idn-to-ascii.php .
var_dump(checkdnsrr('ñandu.cl', 'A')); // 返回 false
var_dump(checkdnsrr(idn_to_ascii('ñandu.cl'), 'A')); // 返回 true
重要警告
您需要在主机名末尾添加一个点,以使其成为完全限定域名。
要了解原因,请尝试执行以下代码段
$d1="gmail.con";
$d2="gmail.con.";
$r1=checkdnsrr($d1, "MX");
$r2=checkdnsrr($d2, "MX");
var_dump($r1);
var_dump($r2);
您会发现,如果没有点,它会声称域名“gmail.con”是有效的。
请注意,如果您计时“checkdnsrr()”调用,您还会发现它在没有点的情况下需要更长时间,因为它将其视为相对域名,并根据其运行的主机名进行多次尝试。
注意:如果您有兴趣,被视为相对域名解释了正在发生的事情。如果您的主机是“example.com”,则相对域名最终将解析为“gmail.con.com.”,可以查找,因此它错误地声称“gmail.con”存在
我总是认为您应该说明显而易见的事情。
包含 checkdnsrr 的函数将在没有互联网连接的情况下返回 false。
因此,在生产环境中,您需要一个活动的互联网连接才能使用有效的电子邮件地址返回 true 结果。
这是一个将以两种方式验证电子邮件地址的小代码示例
- 首先使用正则表达式检查字符串的一般语法
- 然后使用“checkdnsrr”函数检查域名子字符串(“@”之后)
<?php
function validate_email($email){
$exp = "^[a-z\'0-9]+([._-][a-z\'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";
if(eregi($exp,$email)){
if(checkdnsrr(array_pop(explode("@",$email)),"MX")){
return true;
}else{
return false;
}
}else{
return false;
}
}
?>
无法验证使用“ñ”的域名。
在我的国家,可以使用“ñ”字符注册域名。例如
ñandu.cl
http://nic.cl/cgi-bin/dom-CL?q=%F1andu
如果我使用此函数检查 DNS 记录,它将返回 false,但域名已存在
var_dump(checkdnsrr('ñandu.cl', 'A')); // 返回 false
$this->_buf - 用于批量检查缓存
function ValidateEmail($email)
{
list($user, $domain) = explode('@', $email);
if (!filter_var($email, FILTER_VALIDATE_EMAIL) !== FALSE)
return 0;
if (isset($this->_buf[$domain]))
return $this->_buf[$domain];
if (checkdnsrr($domain) === FALSE) {
$this->_buf[$domain] = 0;
return 0;
}
$this->_buf[$domain] = 1;
return 1;
}