有没有一种比较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**太难了。这已经足够了