Неверный 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, и это проснулось. Но я не уверен, как именно ошибка была исправлена ​​на самом деле.


person fugitive    schedule 27.07.2016    source источник
comment
Будьте осторожны с использованием PHP_EOL в этом контексте. Сервер, на котором вы его запускаете, может быть *nix и использовать \n, но файл мог быть сгенерирован в Windows и, следовательно, иметь \r\n   -  person Jeremy Harris    schedule 27.07.2016
comment
Вместо file_get_contents и explode(PHP_EOL просто используйте file(. Также var_dump ваша переменная $value, чтобы убедиться, что она соответствует ожиданиям.   -  person chris85    schedule 27.07.2016
comment
@TessellatingHeckler x.x.x — это просто маски для IP. Я запускаю тест своего Debian.   -  person fugitive    schedule 27.07.2016
comment
@MilosM, но ваш файл буквально содержит 180.x.x.x? Или он содержит кучу реальных IP-адресов, соответствующих этому шаблону, например. 180.1.2.3?   -  person Chris    schedule 27.07.2016
comment
Попробуйте trimизменить свои IP-адреса, прежде чем проверять их.   -  person aynber    schedule 27.07.2016
comment
Я отредактировал свой вопрос. Я пробовал с file безуспешно, когда я выгружаю $value, я получаю строку IP4, как и ожидалось (без пустых символов в начале и в конце). Я понятия не имею, что не так :/   -  person fugitive    schedule 27.07.2016
comment
Вы получаете 16 за длину, когда сбрасываете?   -  person frz3993    schedule 27.07.2016


Ответы (1)


Я буду честен, я думаю, что взрывать необработанные данные файла и надеяться на лучшее, возможно, не лучший способ добиться этого. Вместо этого вы должны попытаться извлечь точные данные, которые вам нужны, используя регулярные выражения, чтобы вы были уверены, что извлекаете правильные значения.

Попробуйте что-то вроде этого:

$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 для соответствия IP-адресу< /а>

Если это не поможет, то это может быть проблема с конфигурацией. Еще несколько моментов, которые могут помочь при устранении неполадок:

  • gethostbyaddr('127.0.0.1'); выдает ту же ошибку?
  • У вас есть брандмауэр, который предотвращает прохождение DNS-запроса?
  • Можете ли вы использовать команду dig с сервера для поиска IP-адреса?
person Jeremy Harris    schedule 27.07.2016
comment
Это также неправильное регулярное выражение, поскольку оно будет соответствовать 333.444.555.666, что не является допустимым IP-адресом. - person TessellatingHeckler; 27.07.2016
comment
@Jeremy Harris Попробовал и вашу версию, добавил дополнительную проверку, верно ли регулярное выражение, но не проходит проверку. Он также не проходит проверку с помощью FILTER_VALIDATE_IP. Это моя версия php: PHP 5.6.24-0+deb8u1 - person fugitive; 27.07.2016
comment
Я добавил код filter_var, который вам нужно будет использовать, чтобы убедиться, что это действительный адрес IP4, но похоже, что вы пробовали это, и это не сработало. - person Jeremy Harris; 27.07.2016
comment
@MilosM Это помогло? Вы приняли ответ. Если да, то в чем проблема? Мне искренне любопытно. - person Jeremy Harris; 27.07.2016
comment
@JeremyHarris Честно говоря, я не знаю. Но и ваше, и мое решение работает до сих пор. Если я не выполняю дополнительные проверки с помощью регулярного выражения или filter_var, выдается предупреждение, но сценарий выполняется правильно в обоих случаях. Что меня сейчас беспокоит, так это то, что оператор if else бота является true , так как я получаю rnds и ошибку, что IP не прошел проверку. - person fugitive; 27.07.2016
comment
@MilosM И if, и else выполняются? Это звучит неправильно. Какую ошибку вы получаете? Безопасные IP-адреса для публичного списка (во избежание неточных комментариев к IP-адресам): 10.*.*.*, 192.168.*.* и/или 172.16-31.*.*. - person chris85; 27.07.2016
comment
@JeremyHarris Нет ошибки, приятель, я просто получаю результат из обоих утверждений. Очень странно. я использую свою версию - person fugitive; 27.07.2016