2016-06-05 3 views
2

Я попытался извлечь только IP-адреса из данного примера ввода, но он извлекает из него какой-то текст. Вот мой код:Regex для извлечения только адресов IPv4 из текста

$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 не является правильным.

Не могли бы вы помочь мне найти правильное регулярное выражение для извлечения только IP-адресов IPv4? Благодарю.

+0

Пробовал '/ \ d {1,3} \. \ D {1,3} \. \ D {1,3} \. \ D {1,3} /'? – Thamilan

+0

yeh это работает просто отлично, но одна небольшая проблема заключается в том, что я не могу извлечь класс cidr v = spf1 ip4: 205.201.128.0/20 ip4: 198.2.128.0/18? All можно извлечь cidr 205.201.128.0/ 20 –

+0

Затем измените его на: '/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:\/\d {2})?/' – Thamilan

ответ

2

Используйте следующее регулярное выражение:

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

да, что просто @Thamilan спасибо. –

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