正则表达式仅从文本中提取 IPv4 地址
Regex to extract only IPv4 addresses from text
我试图从给定的示例输入中仅提取 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);
我希望仅匹配 table 每一列中的 IPv4 IP 地址 xxx.xxx.xxx.xxx
,但看起来 $regexIpAddress
不正确。
你能帮我找到正确的正则表达式来只提取 IPv4 IP 地址吗?谢谢
您需要 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"
}
使用以下正则表达式:
/\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"
}
}
我试图从给定的示例输入中仅提取 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);
我希望仅匹配 table 每一列中的 IPv4 IP 地址 xxx.xxx.xxx.xxx
,但看起来 $regexIpAddress
不正确。
你能帮我找到正确的正则表达式来只提取 IPv4 IP 地址吗?谢谢
您需要 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"
}
使用以下正则表达式:
/\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"
}
}