2011-01-09 11 views
0

ipがワイルドカードを含むブラックリストに登録されたipsのデータベースと一致するかどうかを知るためのスニペットを作成する方法がわかりません。 例:ワイルドカードのIPv4文字列に一致するPHPコード

$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

答えて

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)のように、それらを後で追加することができ、

関連する問題