包含多行IP地址的无效IP地址

时间:2016-07-27 18:35:30

标签: php ip gethostbyaddr

我在尝试读取保存由新行分隔的IP地址的文件时遇到此错误。我想要做的是阅读我的文件,其中包含大量的IP,并检查他们是否有正确的记录。这是我的代码:

$file = "test.sh";

if (is_file($file) && is_readable($file)) {
    $get_file_data = file_get_contents($file);

    $turn_to_array = explode("\n", $get_file_data);

    foreach ($turn_to_array as $key => $value) {

        if (filter_var($value, FILTER_VALIDATE_IP)) {
            echo gethostbyaddr(trim($value));
        } else {
            echo "IP invalid";
        }
    }
}

我的test.sh文件如下所示:

编辑: IP的例子

180.1.1.1
181.1.1.2

我是否需要添加一些特定的测试来解析文件,还是有其他问题?

由使用的非常独特的方法引起的错误:

  

警告:gethostbyaddr():地址不是有效的IPv4或IPv6 PHP

解决。

我的代码正常运行,我没有正确获取rdns记录,因为它并不适用于那些IP。我已使用主机185.1.1.1 对其进行了检查,并返回了实际的IP而非域名。然后检查了我确信他们有PTR记录的IP,并且它已经开通了。但我不确定究竟是如何修复错误的。

1 个答案:

答案 0 :(得分:0)

我说实话,我认为爆炸原始文件数据并希望最好的可能不是实现这一目标的最佳方法。相反,您应该尝试使用正则表达式提取所需的确切数据,以确保提取正确的值。

尝试这样的事情:

$data = file_get_contents($file);

// This regex matches things that resemble an IP4 address
if (preg_match_all("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/", $data, $addresses)) {

    foreach ($addresses as $address) {

        // Need to verify it ACTUALLY is a valid IP address
        if (filter_var($address, FILTER_VALIDATE_IP)) { 

            echo gethostbyaddr($address);

        }

    }

}

注意:此处使用的正则表达式由@alex编写:Regex to match an IP address

如果这没有帮助,则可能是配置问题。还需要检查一些可能有助于排除故障的其他事项:

  • gethostbyaddr('127.0.0.1');会抛出同样的错误吗?
  • 您是否有阻止DNS请求通过的防火墙?
  • 您是否可以使用服务器上的dig命令对IP进行查找?