2016-07-27 1 views
0

IP 주소가 새 줄로 구분 된 파일을 읽으려고 할 때이 오류가 발생합니다. 내가하고 싶은 일은, IP 묶음을 가지고있는 나의 파일을 읽는 것이고, 그들이 적절한 기록을 가지고 있는지 확인하는 것입니다.여러 줄의 IP 주소가있는 잘못된 IP 주소

편집 : 예를 들어 IP의

180.1.1.1 
181.1.1.2 

내가 파일을 구문 분석하는 일부 특정 테스트를 추가해야합니까 또는

$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 파일은 다음과 같습니다 : 이것은 내 코드입니다 다른 문제가 있습니까?

사용되는 매우 독특한 방법에 의한 오류 :

경고 :이 gethostbyaddr() : 주소가 아닌 해결 유효한 IPv4 또는 IPv6 PHP

.

내 코드가 제대로 작동하지 않았기 때문에 rdns 레코드가 올바르게 생성되지 않았습니다. IP에 해당하지 않았기 때문입니다. 나는 호스트 185.1.1.1으로 확인했고 도메인이 아닌 실제 IP를 반환했습니다. 그런 다음 PTR 레코드가 있다고 확신하는 IP를 확인하고 멍청하게 봤습니다. 그러나 오류가 실제로 어떻게 고정되었는지 정확히 모르겠습니다.

+0

이 문맥에서'PHP_EOL'을 사용할 때주의하십시오. 실행중인 서버가 * nix 일 수 있고'\ n'을 사용할 수 있지만 Windows에서 파일이 생성되어'\ r \ n '이 될 수도 있습니다 –

+2

'file_get_contents' 및'explode (PHP_EOL') 대신 'File ('또한'var_dump' 변수'$ value'를 사용하여 예상대로 확인합니다.) – chris85

+0

@TessellatingHeckler xxx는 IP 마스크 일뿐입니다. 데비안을 테스트하고 있습니다. – 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); 

     } 

    } 

} 

참고 : 여기에 사용되는 정규식은 여기 @ 알렉스에 의해 작성되었습니다 : Regex to match an IP address

를이 문제가 해결되지 않으면 다음이 구성 문제가 될 수 있습니다. 문제를 해결하는 데 도움이되는 몇 가지 다른 사항은 다음과 같습니다.

  • gethostbyaddr('127.0.0.1');이 동일한 오류를 발생합니까?
  • DNS 요청이 통과하지 못하게하는 방화벽이 있습니까?
  • 서버에서 명령을 사용하여 IP에서 조회를 수행 할 수 있습니까?
+0

유효한 정규 표현식이 아닌 '333.444.555.666'과 일치하기 때문에 정규식이 잘못되었습니다. – TessellatingHeckler

+0

@Jeremy Harris 당신의 버전도 시험해 보았고, regexp가 참이라면 추가 검사를했지만 검증에 실패했습니다. _FILTER_VALIDATE_IP_로 검증에 실패합니다. 이것은 내 PHP 버전입니다 : PHP 5.6.24-0 + deb8u1 – fugitive

+0

유효한 IP4 주소인지 확인하는 데 사용해야하는'filter_var' 코드가 추가되었지만 시도해 보았지만 작동하지 않는 것처럼 들립니다 . –