2016-07-27 164 views
0

我在嘗試讀取保存由新行分隔的IP地址的文件時遇到此錯誤。我想要做的是閱讀我擁有一堆IP的文件並檢查它們是否有正確的記錄。這是我的代碼:帶有多行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而不是域。然後檢查知道IP的人,我確信他們有PTR記錄,並且它啓動了。但我不確定究竟是如何確定錯誤的。

+0

在此上下文中使用'PHP_EOL'時要小心。你正在運行它的服務器可能是* nix並使用'\ n',但該文件可能已經在Windows上生成,因此具有'\ r \ n' –

+2

而不是'file_get_contents'和'explode(PHP_EOL'只是使用''也'var_dump'你的變量'$ value'來確認它是如預期的那樣 – chris85

+0

@TessellatingHeckler xxx只是IP的掩碼 我正在運行測試我的Debian – fugitive

回答

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請求通過的防火牆嗎?
  • 您可以使用服務器的命令對IP進行查找嗎?
+0

這也是一個不正確的正則表達式,因爲它會匹配'333.444.555.666'這不是一個有效的IP。 – TessellatingHeckler

+0

@Jeremy Harris試了一下你的版本,如果regexp是真的,增加額外的檢查,但是驗證失敗。它也無法通過_FILTER_VALIDATE_IP_進行驗證。這是我的PHP版本:PHP 5.6.24-0 + deb8u1 – fugitive

+0

我添加了'filter_var'代碼,您將不得不使用它來確保它是一個有效的IP4地址,但聽起來像您嘗試過,並且它不起作用。 –