从文本中提取IPv4地址的正则表达式

5

我尝试从给定的示例输入中仅提取IP地址,但它还提取了一些文本。这是我的代码:

$spfreccord="v=spf1 include:amazonses.com include:nl2go.com include:smtproutes.com include:smtpout.com ip4:46.163.100.196 ip4:46.163.100.194 ip4:85.13.135.76 ~all";

 $regexIpAddress = '/ip[4|6]:([\.\/0-9a-z\:]*)/';        
 preg_match($regexIpAddress, $spfreccord, $ip_match);
 var_dump($ip_match);

我希望匹配表格中每一列中仅为IPv4 IP地址xxx.xxx.xxx.xxx的数据,但是看起来$regexIpAddress不正确。

请您帮忙找到正确的正则表达式以提取仅为IPv4 IP地址的数据。谢谢。


尝试过使用 /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ 吗? - Thamilhan
是的,它可以正常工作,但有一个小问题,就是我无法提取CIDR类。 v=spf1 ip4:205.201.128.0/20 ip4:198.2.128.0/18 ?all是否可能提取CIDR 205.201.128.0/20? - salaheddine Rmaili
然后将其更改为:/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:\/\d{2})?/ - Thamilhan
嗨@Will,你的答案很好用,但我不需要提取IP地址中的文本“ip4”。嗨@Thamilan,你的答案对我很有帮助,但是有一个问题,我无法像这样提取CIDR类:198.2.128.0/18。所以请问是否有什么可以添加到我的ipregex中,以便提取像这个例子198.2.128.0/18中的CIDR?谢谢大家。 - salaheddine Rmaili
@sala.eddi 我的程序只提取IP地址,没有提取文本。请看我示例中的输出。 - Will
嗨,威尔,是的,但它提取的记录是这样的:ip4:94.176.182.0。我不需要提取ip4,而是需要提取像198.2.128.0/18这样的CIDR类。无论如何,谢谢你的帮助。 嗨,@Thamilan,你的答案是我的问题的好答案,因为它给了我类和唯一的IP地址,非常感谢。 - salaheddine Rmaili
2个回答

6

请使用以下正则表达式:

/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:\/\d{2})?/

所以针对这个问题:
$spfreccord="v=spf1 include:amazonses.com include:nl2go.com include:smtproutes.com include:smtpout.com ip4:46.163.100.196 ip4:46.163.100.194 ip4:85.13.135.76 cidr class v=spf1 ip4:205.201.128.0/20 ip4:198.2.128.0/18 ~all";

 $regexIpAddress = '/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:\/\d{2})?/';        
 preg_match_all($regexIpAddress, $spfreccord, $ip_match);
 var_dump($ip_match);

提供:

array(1) {
  [0]=>
  array(5) {
    [0]=>
    string(14) "46.163.100.196"
    [1]=>
    string(14) "46.163.100.194"
    [2]=>
    string(12) "85.13.135.76"
    [3]=>
    string(16) "205.201.128.0/20"
    [4]=>
    string(14) "198.2.128.0/18"
  }
}

1

您需要使用preg_match_all()函数,并稍微修改您的正则表达式:

php >  $regexIpAddress = '/ip4:([0-9.]+)/';
php >  preg_match_all($regexIpAddress, $spfreccord, $ip_match);
php >  var_dump($ip_match[1]);
array(3) {
  [0]=>
  string(14) "46.163.100.196"
  [1]=>
  string(14) "46.163.100.194"
  [2]=>
  string(12) "85.13.135.76"
}
php >

您不需要匹配 a-z;它不是 IP 地址(4 或 6)的有效部分。由于您说您只想要 IPv4,我已经排除了任何 IPv6 地址的匹配。

如果您也想包含 IPv6,则可以这样做:

php > $regexIpAddress = '/ip[46]:([0-9a-f.:]+)/';
php > preg_match_all($regexIpAddress, $spfreccord, $ip_match);
php > var_dump($ip_match[1]);
array(4) {
  [0]=>
  string(14) "46.163.100.196"
  [1]=>
  string(14) "46.163.100.194"
  [2]=>
  string(12) "85.13.135.76"
  [3]=>
  string(39) "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接