Как получить IP: PORT с помощью регулярных выражений? - PullRequest
10 голосов
/ 05 декабря 2011

Я создаю небольшой скребок IP: PORT в PHP. Проблема в том, что я незнаком с RegEx.

Так что я собираю воедино все, что могу.

Вот что у меня есть: /\b(?:(?: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]?):([0-9]{1,5})\b/

Я знаю, что это не самое лучшее. По крайней мере, это не конец захвата порта, потому что это означает, что порты смогут быть такими, как 99999.

Кроме того, похоже, таким образом возвращаются два совпадения. IP: ПОРТ и ПОРТ. Мне просто нужно, чтобы получить полный IP: PORT, а не один или другой.

Ответы [ 5 ]

5 голосов
/ 13 февраля 2013

Я разместил регулярное выражение ниже того, что соответствует ip или ip и порту.

$ip = '111.222.333.444';
if ( preg_match('/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\:?([0-9]{1,5})?/', $ip, $match) ) {
   echo 'ip: ' . $match['1'] . (isset($match['2']) ? ' port: ' . $match['2'] : '');
}
4 голосов
/ 05 декабря 2011

С вашим регулярным выражением все в порядке, поэтому я просто сконцентрируюсь на самом порте. Это регулярное выражение:

(?::                #Match the :
  (?![7-9]\d\d\d\d) #Ignrore anything above 7....
  (?!6[6-9]\d\d\d)  #Ignore anything abovr 69...
  (?!65[6-9]\d\d)   #etc...
  (?!655[4-9]\d)
  (?!6553[6-9])
  (?!0+)            #ignore complete 0(s)
  (?<Port>\d{1,5})
)?

При необходимости перехватит любой действительный номер порта и сохранит его в именованном групповом порту.

Примечание: свободный интервал должен быть включен:

if (preg_match(
    '/\b(?:(?: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]?)
    (?::
      (?![7-9]\d\d\d\d) #Ignrore anything above 7....
      (?!6[6-9]\d\d\d)  #Ignore anything abovr 69...
      (?!65[6-9]\d\d)   #etc...
      (?!655[4-9]\d)
      (?!6553[6-9])
      (?!0+)            #ignore complete 0(s)
      (?P<Port>\d{1,5})
    )?
    \b/x', 
    $subject)) {
    # Successful match
}
2 голосов
/ 05 декабря 2011

Вы можете попробовать это:

\b(?:(?: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]?):\d{1,5}\b

Есть несколько примеров соответствия IP здесь .Просто возьмите любой из них и поставьте :\d{1,5}\b на конце (чтобы соответствовать порту).

1 голос
/ 05 декабря 2011

Я использовал это давным-давно.

[0-9]{3}.[0-9]{3}.[0-9]{3}.[0-9]{3}:[0-9]{5}
0 голосов
/ 23 мая 2018

Порт FailedDev часть его ответа - немного его укоротил и установил границы, это только перехватит порт

\b(?![7-9]\d{4})(?!6[6-9]\d{3})(?!65[6-9]\d{2})(?!655[4-9]\d)(?!6553[6-9])(?!0+)(\d{1,5})\b
...