2

ユーザーのIPアドレスを使用してユーザーの国の場所と都市を見つけるAPIを使用していますが、これまで正規表現を使用したことがなく、必要な他の情報を抽出する方法がわかりません。

    $location=file_get_contents('http://api.hostip.info/get_html.php?ip='.$ip);

この行は次のようになります。'国:イギリス(GB)市:エジンバラIP:80.192.82.75 '正規表現を使用してIPアドレスを抽出できましたが、国と市を別々の変数に削除する方法がわかりません($ country =、 $ city =)。これが私がこれまでに持っている以下のコードです。

 $ip=$_SERVER['REMOTE_ADDR'];
 $location=file_get_contents('http://api.hostip.info/get_html.php?ip='.$ip);
 preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/", $location, $matches); 
 $ip = $matches[0]; 
4

3 に答える 3

1

ミリムースからの提案を取り入れると、次のようになります。

$jstring = file_get_contents('http://api.hostip.info/get_json.php?ip='.$ip);
$ipinfo = json_decode($jstring);

そして、これは次のようになります:

stdClass Object
(
    [country_name] => NETHERLANDS
    [country_code] => NL
    [city] => (Unknown city)
    [ip] => xx.xx.10.9
)

これは次のように使用できます。

echo $ipinfo->city;
于 2012-09-08T14:06:32.897 に答える
0

正規表現パターンを使用/Country: ([^\(]+) \(([^\)]+)\) City: ([^:]+) IP: ([\d.]+)/

于 2012-09-08T14:14:18.027 に答える
0

1 つの方法は、Country:、City:、および IP: を区切り文字として使用することです。API が常に 3 つのフィールドすべてを返す場合、それらすべてを一度に取得できます。

/^Country: (.*?) City: (.*?) IP: (.*?)$/

または、そうでない場合は、それらを 1 つずつ抽出することをお勧めします。

/Country: (.*?)(?: \w+?:)?/
/City: (.*?)(?: \w+?:)?/
/IP: (.*?)(?: \w+?:)?/

PHP 部分に関する限り、括弧内のパターンからの一致は、ドキュメントごとに match 配列で返されます ( (?: と ) の間のパターンを除く)。したがって、エジンバラは、上に挙げた最初の式の $matches[2] で返されるはずです。

特に二重引用符で囲まれている場合は、上記の文字列に追加のエスケープが必要になる可能性があることに注意してください。

于 2012-09-08T14:20:17.463 に答える