【问题标题】:Check if string is ip subnet检查字符串是否为 ip 子网
【发布时间】:2014-02-20 19:36:07
【问题描述】:

我有字符串形式的 IP 地址列表,但该列表中也有一些子网。 例如:

... 127.0.0.1(这是ip) 127.0.0.1/24(这是子网) ...

我想检查哪个是 ip,哪个是子网。到目前为止,我可以过滤 ip,但我找不到检查子网的方法:

foreach ($ipstrings as $ip) {
        if(filter_var($ip, FILTER_VALIDATE_IP) !== false){
            $ips[] = $ip;
        }
        elseif (is_subnet) {
            $subnets[] = $ip;
        }
    }

如何使 is_subnet 工作?

【问题讨论】:

  • 您的“网络”不正确。 127.0.0.1 不是正确的网络地址(可以应用网络掩码 24)。将其修复为127.0.0.0。然后将您的网络分成几部分:127.0.0.024。然后将 24 转换为相应的位。检查后是:HOST & MASK = NET。如果正确,答案是“属于”
  • 我只是给了样例号,可以是任意ip

标签: php regex ip subnet


【解决方案1】:
<?php

// array of ip and subnets
$ipandmask = array('127.0.0.1','127.0.0.0','127.0.0.2','127.0.0.3/24','127.0.0.4/16'); 

foreach ($ipandmask as $ipmask) {

        if(preg_match('~^(?:[0-9]{1,3}\.){3}[0-9]{1,3}/[0-9][0-9]~',$ipmask,$subnet)){
        echo "</br>";
        echo "Subnet =>";
        print_r ($subnet);

    }

        if(preg_match('~^(?:[0-9]{1,3}\.){3}[0-9]{1,3}~',$ipmask,$ip)){
        echo "</br>";
        echo "Ip =>";
        print_r ($ip);

    }

}


    ?>

【讨论】:

  • 谢谢。我想要的只是您代码的这一部分: preg_match('~^(?:[0-9]{1,3}\.){3}[0-9]{1,3}/[0-9 ][0-9]~',$ipmask,$subnet)
【解决方案2】:

你可以这样做:

$ip = '127.0.0.1/124';
$subnet = '';
if (preg_match('~^(.+?)/([^/]+)$~', $ip, $m)) {
   $ip = $m[1];
   $subnet = $m[2];
}
echo filter_var($ip, FILTER_VALIDATE_IP) . ", $subnet";

【讨论】:

  • 我不习惯不测试就发布代码。请参阅工作演示:ideone.com/XAgYgC 很可能键盘正在使用一些非常旧的 PHP 版本。
  • 好的,抱歉。您能否详细说明您的正则表达式正在做什么(匹配的规则是什么),我不太擅长理解正则表达式,请
  • 是的。正则表达式尝试通过在 / 之前和之后查找文本来破坏 IP 字符串。如果preg_match 成功,则表示已找到子网。在这种情况下,捕获的组 #1 将是实际 IP 地址,而捕获的组 #2 将是子网。如果preg_match不成功则为普通IP,$subnet为空。
【解决方案3】:

你可以试试这个...

<?php
$ip="127.0.0.1/25";
$x = explode("/",$ip);
print_r($x);
if (isset($x[1])){
    echo"subnet";
} else {echo "ip";}
?>

【讨论】:

  • 是的,这与我已经做过的类似,但这不是最好的方法,因为 $ip 可能包含一些不应被视为子网或 ip 的字符
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 2012-04-12
  • 2011-11-09
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2013-12-13
相关资源
最近更新 更多