Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Regex仅从文本中提取IPv4地址_Php_Regex_Ip_Spf - Fatal编程技术网

Php Regex仅从文本中提取IPv4地址

Php Regex仅从文本中提取IPv4地址,php,regex,ip,spf,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\:]

我试图只从给定的示例输入中提取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地址的正确正则表达式吗?谢谢。

您需要,并对您的正则表达式稍加修改:

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"
}

使用以下正则表达式:

/\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"
  }
}

尝试了
/\d{1,3}\.\d{1,3}.\d{1,3}/
?是的,它工作得很好,但有一个小问题是我无法提取cidr类v=spf1 ip4:205.201.128.0/20 ip4:198.2.128.0/18?所有这些都可以提取cidr 205.201.128.0/20,然后将其更改为:
/\d{1,3}.\d{1,3}{?/
Hi@Will your answer工作正常,但我不需要用ips提取文本“ip4”,您好@Thamilan您的回答对我来说很好,但有一个问题是我无法提取像这样的类cidr
198.2.128.0/18
,所以如果有什么东西可以添加到我的ipregex中,也可以提取像这样的cidr
198.2.128.0/18
谢谢all@sala.eddi我的不是提取文本,只是提取IP。请看我的示例中的输出。