Regex для обрезания лидирующих нулей из октетов IPv4

0

Я использую следующее регулярное выражение в скрипте 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, похоже, работает?.

  • 0
    Я не понимаю, почему вы не хотите, чтобы эти ведущие нули. Также неверно в соответствии с чем?
  • 0
    Он используется в Таблице FreeBSD pf, которая не работает с ведущими нулями.
Показать ещё 4 комментария
Теги:

2 ответа

2
Лучший ответ

Упрощение:

preg_replace('/\b0+/', '', $str);

Поскольку мы знаем, что единственные границы слова находятся в. и начало/конец строки

Изменить: похоже, нам нужен взгляд, чтобы избежать пустых октетов

preg_replace('/\b0+(?=\d)/', '', $str)
  • 0
    Это, кажется, удаляет также один ноль октетов. т.е. 38.10.0.0 будет выводить до 38.10 ..
  • 0
    @ ca171 ты прав, см. мои правки.
Показать ещё 2 комментария
2

Почему бы не использовать 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
}
  • 0
    Кажется, он не работает для этих примеров "038.010.000.000", "008.010.0.0" выводит до 38.10.00.00, 08.10.0.0. Все еще остаются некоторые ведущие нули.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню