2011-01-09 47 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);