Regex для извлечения только IPv4-адресов из текста

Я попытался извлечь только 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);

Я ищу, чтобы соответствовать только IP-адрес IPv4 xxx.xxx.xxx.xxx в каждом столбце таблицы, но похоже, что $regexIpAddress не является правильным.

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

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

Другие решения

Ты хочешь 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"}
1

По вопросам рекламы [email protected]