#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}
было бы идеально?