Проверка специальной формы IP-адреса - PullRequest
0 голосов
/ 24 августа 2011

Я обнаружил странный IP-адрес с избыточными нулевыми значениями среди октетов.Есть ли в любом случае, чтобы правильно проверить это как IP или использовать регулярное выражение для удаления этих избыточных нулей? * Пример 1001 *

следующий: 218. 064 .215.239 (обратите внимание на дополнительный ноль ввторой октет "064").

У меня есть одна работающая функция проверки IP, но она не будет правильно проверять этот Ip из-за природы регулярного выражения, неспособного принять этот дополнительный ноль.Ниже приведен код в PHP:

function valid_ip($ip) {
    return preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" .
            "(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $ip);
} 

спасибо за любую помощь заранее заглядывает!: D

Ответы [ 6 ]

0 голосов
/ 24 августа 2011

Вы должны выяснить, откуда взялись эти дополнительные нули. Эти ведущие нули нельзя просто отбросить. На большинстве платформ они означают, что октет находится в восьмеричной форме, а не в десятичной. То есть: 064 восьмеричное равно 52 десятичное число.

0 голосов
/ 24 августа 2011

Используйте ip2long () .

0 голосов
/ 24 августа 2011

Измените голые |1 вхождения на |[01].Вы уверены, что это не должно интерпретироваться как восьмеричное число?Некоторые распознаватели делают это.

0 голосов
/ 24 августа 2011

Ты сам пошел?Это действительно довольно просто.

|1[0-9][0-9]| соответствует 100-199, так как вы сейчас хотите соответствовать 000-199 (как указано выше, это 200-155), вам просто нужно сделать набор для 1 быть 1 или 0.

function valid_ip($ip) {
  return preg_match("/^([1-9]|[1-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])".
          "(\.([0-9]|[1-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $ip);
}

И это может быть подвергнуто рефакторингу (допуская ведущие нули) до:

function valid_ip($ip) {
  return preg_match("/^([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])".
          "(\.([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){3}$/", $ip);
}

Или обрезать эти ненужные нули:1013 *

function strip_ip($ip) {
  return preg_replace( '/0+([^0])(\.|$)/' , '$1$2' , $ip );
}
0 голосов
/ 24 августа 2011

Вы должны принять ноль следующим образом:

^(0?[1-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.(0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$

Играть с этим регулярным выражением на rubular.com .

0? Я добавил совпаденияноль или один случай 0.Так, например, 0?[1-9][0-9] соответствует как 010, так и 10, например.

0 голосов
/ 24 августа 2011

Это исправит их:

$ip = "123.456.007.89";
$octets = explode(".", $ip);
$corrected = array();
foreach ($octets as $octet) {
 array_push($corrected, (int)$octet);
}
echo implode(".", $corrected);
...