2010-04-15 20 views
0

En utilisant PHP, je voudrais comparer une adresse IP réelle à une partie d'un, et voir si elle correspond. Par exemple, je veux voir si l'adresse correspond à 12.34. .en comparant IP réel avec IP partielle en PHP

<?php 
$rem_address = getenv('REMOTE_ADDR'); 
$temp = substr ($rem_address,0,6) 
if ($temp == "12.34.") echo "It's a match"; 
?> 

est-il un moyen plus facile/meilleure façon de le faire?

Répondre

4

La fonction strpos ($ haystack, aiguille $) vous dira la première position dans la botte de foin $ chaîne où la sous-chaîne apparaît.

Tant que vous vérifiez avec l'opérateur de comparaison ===, vous pouvez voir si "12.34" apparaît au début de l'adresse IP.

if (strpos ($rem_address, "12.34.") === 0) echo "It's a match"; 

Vérifiez la documentation et prêter une attention particulière à l'avertissement.

+0

Bonne solution, mais je voudrais ajouter un point après 34. ;-) Juste pour être sûr bien sûr ... puisque les segments IPv4 ne devraient pas dépasser 255. –

+0

Excellente suggestion! J'ai réparé ça. (J'aurais dû être plus prudent sur la copie de la chaîne de test originale.) – JSchaefer

+0

En supposant (comme c'est le cas ici, mais peut-être pas toujours) que le fragment que vous correspondez sera toujours le même, vous pourriez faire FOO .BAR' tant que BAR est de 26 ou plus. Si c'est <= 25, vous pouvez rencontrer des faux positifs lorsque vous faites correspondre 12.244 avec 12.24. D'un autre côté, vous ne rencontrerez jamais 12.345. Il est probablement plus sûr de faire 6 caractères au cas où quelqu'un modifierait le code plus tard, ou que les adresses IP changeraient. – aslum

2
 
$parts = explode(".",$rem_address); 
if ($parts[0] == "12" && $parts[1] == "34") echo "match"; 
0
<?php 
$full_address = getenv('REMOTE_ADDR'); 
$pattern = "/^" . preg_quote('12.34') . "/"; 
$count = preg_match($pattern, $full_address); 
if ($count!=0) { 
//match 
} 
?> 
+0

Pourquoi changer 'getenv ('REMOTE_ADDR'),' à 'getenv [ 'REMOTE_ADDR'];' faire le() faire quelque chose de différent alors le [] ? – aslum

+0

Mon erreur, pas de raison de le changer. En fait, cela ne fonctionnerait pas. Corrigée. – RadiantHeart

0

Cependant, plusieurs méthodes, basées sur ip2long:

(ip2long($_SERVER['REMOTE_ADDR']) & 0xFFFF0000) == 0x0C220000 
! ((ip2long($_SERVER['REMOTE_ADDR']) & 0xFFFF0000)^0x0C220000) 
! ((ip2long($_SERVER['REMOTE_ADDR'])^0x0C220000) >> 16)