Синтаксический анализ IP: порта из строки с символами после порта #

#php #regex

#php #регулярное выражение

Вопрос:

Мне нужна небольшая помощь с этим, и моих знаний регулярных выражений немного не хватает с этим.

У меня есть список прокси, который я пытаюсь проанализировать и отделить IP и номер порта от строки.

Считываемая строка выглядит следующим образом.(пример 1)

 121.121.121.121:8081    2.103384    Китай   high    05-07-2014 09:25:17
  

и иногда выглядит как (пример 2)

 222.222.222.222:8081
  

Когда я использую этот код.

 preg_match_all('@[0-9]{1,4}.[0-9]{1,4}.[0-9]{1,4}.@',$ip,$results);
$output = (preg_split('/:/',$results));
$ip = $output['0'];
$port = $output['1'];
  

Это отлично работает, когда есть только IP: порт, как в примере # 2, но в примере # 1
он также захватывает все, что находится за пробелом, поэтому номер порта выглядит как «8081 2.103384 Китай high 05-07-2014 09:25:17»

Есть ли шаблон регулярных выражений, который я могу использовать, чтобы он останавливался на пробеле, если он его видит?

Комментарии:

1. вы уверены в своем фрагменте?

Ответ №1:

При разделении вы сопоставляете только то, что вам не нужно; в этом случае вы хотели бы иметь совпадение.

В вашем случае должно работать следующее соответствующее выражение:

 if (preg_match('/^(d[d.] ):(d )b/', $proxy, $matches)) {
    $ip = $matches[1];
    $port = $matches[2];
}
  

Комментарии:

1. У меня возникли проблемы с сопоставлением табуляции вместо двоеточия. t похоже, не работает

2. @zoltar вы пробовали использовать двойные кавычки вместо одинарных в качестве разделителя строки?

Ответ №2:

Поскольку нет необходимости проверять IP-адреса на этом уровне, есть более короткий способ их сопоставления:

 (d (?(?!:).)){4}:d 
  

Живая демонстрация

PHP:

 preg_match_all('@(d (?(?!:).)){4}:d @', $ip, $results);
  

Ответ №3:

Это регулярное выражение должно соответствовать ip-адресу и номеру порта,

 b[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}:[0-9]{1,5}b
  

ДЕМОНСТРАЦИЯ

Исходя из этого, вы могли бы легко разделить его.

или

вы могли бы использовать preg_match функцию,

 <?php
$str = '121.121.121.121:8081    2.103384    Китай   high    05-07-2014 09:25:17';
if (preg_match('~b([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}):([0-9]{1,5}b)~', $str, $matches)) {
    $ip = $matches[1];
    $port = $matches[2];
}
echo "$ipn";
echo "$portn";
?>
  

Выходной сигнал:

 121.121.121.121
8081
  

Комментарии:

1. Поскольку номер порта может составлять до 5 цифр (максимум 65535), {1,5} было бы идеально?