2011-01-09 3 views
0

Je trouve difficile de trouver comment créer un extrait qui peut me dire si une adresse IP correspond à une base de données d'ips sur liste noire, contenant également des caractères génériques. Exemple:Extrait PHP pour correspondre à des chaînes IPv4 génériques

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

function checkBlacklistedIp ($ip) { 

    // some kind of regular expression 

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

Tout le monde peut aider? La seule approche que j'ai trouvée est de coder une "machine d'état" très très moche qui permute entre 1, 2 ou 3 jokers (4 jokers mèneraient à tout blacklister), mais ce genre de codage est vraiment un gâchis

+0

Quelle est la taille de cette liste? Si petit: remplacez '*' par '[0-9] +' et faites correspondre les expressions rationnelles. Si grand: faites-en un arbre (4 niveaux de profondeur) de tableaux imbriqués. – mvds

Répondre

0

que diriez-vous quelque chose comme ceci:

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

cela d'abord convertir toutes vos adresses IP de la liste noire dans une expression régulière. La fonction passe ensuite sur ceux-ci et essaie de les faire correspondre.

Vous pouvez également écrire vos adresses IP depuis le début en tant qu'expressions régulières, il vous suffit d'échapper le point . et de remplacer * par exemple. \d{1,3}:

array('10\.10\.\d{1,3}\.\d{1,3}', '192\.168\.1\.\d{1,3}'); 

Vous devez également délimiteurs, mais vous pouvez les ajouter plus tard, comme preg_match('#^' + $bid + '$#', $ip);

Questions connexes