如何获取IP:PORT与正则表达式?

时间:2011-12-04 22:07:05

标签: php regex ip port

我正在用PHP创建一个小型IP:PORT scraper。问题是我对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:PORT和PORT。我只需要它来获取完整的IP:PORT,而不是其中一个。

5 个答案:

答案 0 :(得分:5)

我发布了一个正则表达式,其下方与ip或ip和port匹配。

$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'] : '');
}

答案 1 :(得分:4)

你的正则表达式很好所以我只关注端口本身。这个正则表达式:

(?::                #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 :(得分:2)

你可以试试这个:

\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匹配here的示例。只需取出其中任何一个并将:\d{1,5}\b放在最后(以匹配端口)。

答案 3 :(得分:1)

我很久以前就已经习惯了。

[0-9]{3}.[0-9]{3}.[0-9]{3}.[0-9]{3}:[0-9]{5}

答案 4 :(得分:0)

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