Я использую следующее регулярное выражение в скрипте PHP для сбора адресов IPv4, а также для выполнения некоторой проверки адресов IPv4.
Txt файл IP-адресов считывается в массив с помощью команды file()
, тогда цикл foreach с использованием preg_match
и это регулярное выражение соответствует адресам IPv4.
Однако в настоящее время он включает в себя любые начальные нули перед каждым октетом.
Возможно ли улучшить это регулярное выражение, чтобы обрезать любые ведущие нули в каждом октете без полного отбрасывания IP-адресов с ведущими нулями? Я бы предпочел сделать это в одном регулярном выражении вместо добавления дополнительной функции для очистки ведущих нулей.
/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/
Правильный выход:
38.10.125.242
38.1.1.24
Неверный выход:
038.010.125.242
038.001.001.024
Я использую Lumadis.be для тестирования, но ни одно из регулярных выражений, которое я пробовал из других ответов в Stack Overflow, похоже, работает?.
Упрощение:
preg_replace('/\b0+/', '', $str);
Поскольку мы знаем, что единственные границы слова находятся в. и начало/конец строки
Изменить: похоже, нам нужен взгляд, чтобы избежать пустых октетов
preg_replace('/\b0+(?=\d)/', '', $str)
Почему бы не использовать filter_var
и простое выражение преобразования:
// strip leading zeroes from each octet
$str = preg_replace('/(?<=^|\.)0+(?=\d)/', '', $str);
if (filter_var($str, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) {
// valid ipv4 address
}