有没有一种比较PHP中IP的简单方法?
一方面,我有一个类似于有没有一种比较PHP中IP的简单方法?,php,ip,Php,Ip,一方面,我有一个类似于123.3.2.3的IP,我想将其与允许的IP数组进行比较,比如: $allowedIps = ['123.*.*.*', '123.3.2.3', '123.3.2.3::1', '123.3.*.3'] 在这种情况下,它应该匹配所有项目 有没有一种简单的方法可以做到这一点,而不必创建复杂的字符串比较算法?如果您不打算将通配符用作123.3.2*.3,它将匹配123.3.20.3和123.3.29.3之间的任何IP,那么下面的解决方案就可以了 在数组中的IP上循环,如果
123.3.2.3
的IP,我想将其与允许的IP数组进行比较,比如:
$allowedIps = ['123.*.*.*', '123.3.2.3', '123.3.2.3::1', '123.3.*.3']
在这种情况下,它应该匹配所有项目
有没有一种简单的方法可以做到这一点,而不必创建复杂的字符串比较算法?如果您不打算将通配符用作
123.3.2*.3
,它将匹配123.3.20.3
和123.3.29.3
之间的任何IP,那么下面的解决方案就可以了
在数组中的IP上循环,如果其中存在通配符,则创建两个新IP-其中一个通配符*
替换为0,另一个替换为255。这是下限和上限。然后使用ip2long()
函数将其转换为整数,而不是IP字符串。在IP本身和循环时在数组中的值上执行此操作
那么,这只是一个比较它们的问题,事实上是在上限和下限之间
如果字符串中没有通配符,请进行直接比较
$allowedIps = ['123.2.*.*', '123.3.2.3', '123.3.*.3'];
$IP = '123.3.1.3';
$match = 0;
foreach ($allowedIps as $allowed) {
// If there is no wildcard, we check for the specific IP instead, and not a range
if (strpos($allowed, "*") !== false) {
$lowest = str_replace("*", "0", $allowed);
$highest = str_replace("*", "255", $allowed);
if (ip2long($IP) >= ip2long($lowest) && ip2long($IP) <= ip2long($highest)) {
echo "$IP matched $allowed";
$match = 1;
break;
}
} elseif (ip2long($IP) === ip2long($allowed)) {
echo "Matched ".$allowed;
$match = 1;
break;
}
}
$allowedIps=['123.2.*'、'123.3.2.3'、'123.3.*.3'];
$IP='123.3.1.3';
$match=0;
foreach($allowedIps as$allowed){
//如果没有通配符,我们将检查特定的IP,而不是范围
if(strpos($allowed,“*”)!==false){
$looster=str_replace(“*”、“0”、$allowed);
$highest=str_replace(“*”、“255”、$allowed);
如果(ip2long($IP)>=ip2long($lower)&&ip2long($IP)使用in_array
php函数,这里有一个参考,可以用0和255替换*
,然后用ip2long()
@ashir,这不起作用,因为我们在寻找通配符,而不是固定字符串。你是否只将通配符用作范围,或者也使用范围的一部分?例如,123.3.2*
是否有效(这里是第三个范围内任何2X的ip,20-29)。如果我能用123.3.*来管理,我想123.3.2**太难了。这已经足够了