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

时间:2016-06-05 10:36:51

标签: php regex ip spf

我试图从给定的示例输入中仅提取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地址?感谢。

2 个答案:

答案 0 :(得分:4)

使用以下正则表达式:

/\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 :(得分: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"
}