PHP preg_match проблема с IPv6 - PullRequest
       20

PHP preg_match проблема с IPv6

2 голосов
/ 01 декабря 2010

Я сопоставляю IP-адреса в PHP. Итак, мой чек:

function checkIP($ip){
    $ip = trim($ip);
    if (preg_match("\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b", $ip)) return true;
    $v6pattern = "/
(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,6}\Z)|
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}\Z)|
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}\Z)|
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}\Z)|
(\A([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}\Z)|
(\A([0-9a-f]{1,4}:){1,6}(:[0-9a-f]{1,4}){1,1}\Z)|
(\A(([0-9a-f]{1,4}:){1,7}|:):\Z)|
(\A:(:[0-9a-f]{1,4}){1,7}\Z)|
(\A((([0-9a-f]{1,4}:){6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
(\A(([0-9a-f]{1,4}:){5}[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
(\A([0-9a-f]{1,4}:){5}:[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,3}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,2}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,1}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A(([0-9a-f]{1,4}:){1,5}|:):(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A:(:[0-9a-f]{1,4}){1,5}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)
/x";
    if (preg_match($v6pattern, $ip)) return true;
    return false;
}

Однако я получаю сообщение об ошибке: warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in C:\xampp\htdocs\index.php on line 5

Строка 5: if (preg_match("\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b", $ip)) return true;

Что не так?

Ответы [ 5 ]

5 голосов
/ 01 декабря 2010

Я бы пропустил регулярное выражение и использовал модуль validate из ZendГораздо проще и надежнее, чем регулярное выражение, которое вы разместили.

  $validator = new Zend_Validate_Ip();

  if ($validator->isValid($ip)) {

      // ip appears to be valid

  } else {

      // ip is invalid; print the reasons

  }
5 голосов
/ 01 декабря 2010

Вы должны поместить свое регулярное выражение между разделителями.Проверьте Ручная .Вы также можете использовать фильтры и не изобретать велосипед.Например:

filter_var($var, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); //for IP's V6

и

filter_var($var, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); //for IP's V4
2 голосов
/ 01 декабря 2010

Ваш первый вызов preg_match не имеет разделителя для используемого регулярного выражения.

PHP ожидает, что регулярное выражение в preg_match будет заключено в пару разделителей. Символ / является популярным выбором разделителя, который также используется при вашем втором вызове preg_match. Вы также можете использовать такие символы, как #, |, @, ~, !.

Добавить пропущенный разделитель как:

if (preg_match("#\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b#", $ip)) return true;
                ^                                                                                                                                                                  ^
0 голосов
/ 06 декабря 2013

Чтобы соответствовать IPv4-адресу, вы можете просто использовать:

preg_match ("/ \ d {1,3}. \ D {1,3}. \ D {1,3}.\ d {1,3} / ", $ string, $ result);

0 голосов
/ 02 декабря 2010

Если вы не возражаете против адресов IPv4 и IPv6, было бы удобнее передавать через inet_ntop и inet_pton, например,

function is_ip($address) {
  $packed = inet_pton ($address);
  if (FALSE == $packed || FALSE === inet_ntop ($packed)) {
    return FALSE;
  }
  return TRUE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...