用于匹配通配IPv4字符串的PHP代码段

时间:2011-01-09 01:11:51

标签: php

我发现如何创建一个片段可以告诉我ip是否与列入黑名单的ips数据库(也包含通配符)相匹配。 例如:

$global_blacklistedips = Array ( '10.10.*.*', '192.168.1.*' );

function checkBlacklistedIp ( $ip ) {

    // some kind of regular expression

    // match? return true;
    // else return false;
}

任何人都可以提供帮助?我发现的唯一方法是编写一个非常非常丑陋的“状态机”,在1个,2个或3个通配符之间切换(4个通配符会导致所有内容黑名单),但这种编码实际上是一团糟

2 个答案:

答案 0 :(得分:0)

这样的事情怎么样:

function to_regex($ip) {
    return '/^' . str_replace(array('*', '.',), array('\d{1,3}','\.'), $ip) . '$/';
}

$global_blacklistedips = array_map('to_regex', $global_blacklistedip);

function checkBlacklistedIp ($ip, $global_blacklistedips ) {
    foreach($global_blacklistedips as $bip) {
        if(preg_match($bip, $ip)) {
           return true; 
        }
    }
    return false;
}

这将首先将您的所有黑名单IP转换为正则表达式。然后该函数遍历这些并尝试匹配它们。

您也可以从头开始编写您的IP作为正则表达式,您只需要转义点.并将*替换为例如\d{1,3}array('10\.10\.\d{1,3}\.\d{1,3}', '192\.168\.1\.\d{1,3}');

preg_match('#^' + $bid + '$#', $ip)

您还需要分隔符,但稍后可以添加分隔符,例如{{1}};

答案 1 :(得分:0)

*替换为\d+并使用preg_match