2011-01-09 37 views
0

我发现很难找出如何创建一个片段,可以告诉我,如果一个ip匹配黑名单ips,也包含通配符的数据库。 例如:PHP片段匹配通配的IPv4字符串

$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个通配符会导致所有的黑名单),但是这种编码实际上是一团糟

+0

谁是这个名单会是谁?如果很小:用`[0-9] +`替换`*`并匹配正则表达式。如果大:使它成为嵌套数组的树(4级)。 – mvds 2011-01-09 01:21:15

回答

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);