2010-06-27 18 views
5

Comment pourrais-je utiliser Regex pour obtenir les informations sur une adresse IP à l'API de localisationPHP Regex pour IP API de localisation

Ceci est l'API

http://ipinfodb.com/ip_query.php?ip=74.125.45.100

je besoin pour obtenir le nom du pays , Région/État et Ville.

J'ai essayé ceci:

$ip = $_SERVER["REMOTE_ADDR"]; 
$contents = @file_get_contents('http://ipinfodb.com/ip_query.php?ip=' . $ip . ''); 
$pattern = "/<CountryName>(.*)<CountryName>/"; 
preg_match($pattern, $contents, $regex); 
$regex = !empty($regex[1]) ? $regex[1] : "FAIL"; 
echo $regex; 

Quand je fais écho $ regex Je suis toujours FAIL comment puis-je résoudre ce problème

Répondre

3

Comme Aaron l'a suggéré. Mieux vaut ne pas réinventer la roue, alors essayez l'analyse syntaxique avec simplexml_load_string()

// Init the CURL 
$curl = curl_init(); 

// Setup the curl settings 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 0); 

// grab the XML file 
$raw_xml = curl_exec($curl); 

curl_close($curl); 

// Setup the xml object 
$xml = simplexml_load_string($raw_xml); 

Vous pouvez désormais accéder à une partie de la variable $ xml comme un objet, dans cet égard est ici un exemple de ce que vous avez publié.

<Response> 
    <Ip>74.125.45.100</Ip> 
    <Status>OK</Status> 
    <CountryCode>US</CountryCode> 
    <CountryName>United States</CountryName> 
    <RegionCode>06</RegionCode> 
    <RegionName>California</RegionName> 
    <City>Mountain View</City> 
    <ZipPostalCode>94043</ZipPostalCode> 
    <Latitude>37.4192</Latitude> 
    <Longitude>-122.057</Longitude> 
    <Timezone>0</Timezone> 
    <Gmtoffset>0</Gmtoffset> 
    <Dstoffset>0</Dstoffset> 
</Response> 

maintenant après avoir chargé cette chaîne XML dans le simplexml_load_string(), vous pouvez accéder à l'adresse IP de la réponse comme ceci. Simplexml_load_string() va transformer des fichiers XML bien formés en un objet que vous pouvez manipuler. La seule autre chose que je peux dire est aller l'essayer et jouer avec

EDIT:

Source http://www.php.net/manual/en/function.simplexml-load-string.php

+1

Ou simplement: '$ xml = simplexml_load_file ($ url);' – salathe

+0

Sémantique ;-) il était le seul exemple de travail réel que j'avais autour de la pose – WarmWaffles

2

Vous êtes vraiment mieux à l'aide d'un analyseur XML pour tirer les informations.

Par exemple, this script analysera dans un tableau.

Regex ne devrait vraiment pas être utilisé pour analyser HTML ou XML.

+0

Veuillez poster un exemple! – xZerox

+0

Mis à jour pour vous. =) –

1

Si vous avez vraiment besoin d'utiliser des expressions régulières, alors vous devriez corriger celui que vous utilisent. "|<CountryName>([^<]*)</CountryName>|i" fonctionnerait mieux.

+0

Tel que rapporté des autres, je préfère ne pas utiliser des expressions régulières pour l'analyse syntaxique HTML, XHTML, ou XML si ce n'est pas dans certains cas particuliers. J'ai dû vérifier rapidement si le contenu XML renvoyé contenait un tag, et j'ai utilisé une expression régulière; pour d'autres cas, il est préférable d'utiliser SimpleXML, si le XML renvoyé n'est pas trop grand. – kiamlaluno