2012-09-08 4 views
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]; 
+1

'http : // api.hostip.info/get_json.php'에서 JSON API를 사용하고 일반 JSON 파서를 사용하는 이유는 무엇입니까? – millimoose

+0

JSON에 대한 경험이 없으므로 학습 가치가 있습니까? –

+0

@Greg 예. 매우 간단합니다.'json_decode' 만 사용하면 배울 필요조차 없습니다. –

답변

1

그것과 같을 것이다 millimoose에서 제안 촬영 :

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

을 그리고이 제공 :

echo $ipinfo->city; 
+0

국가 이름을 거기에서 변수로 가져 오는 방법은 무엇입니까? 도움을 감사하십시오. 감사. –

+0

당신은 var에있어, 단지 $ ipinfo-> country_name을 사용합니다 – JvdBerg

0

사용 :

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

이것은로 사용할 수 있습니다 정규식 tern /Country: ([^\(]+) \(([^\)]+)\) City: ([^:]+) IP: ([\d.]+)/

0

한 가지 방법은 국가 :, 도시 : 및 IP :를 구분 기호로 사용하는 것입니다. API가 항상 세 개의 필드를 반환하는 경우, 당신은 한 번에 모두를 검색 할 수 있습니다 :

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

아니면하지 않는 경우, 당신은 그들에게 하나 하나 추출 할 수 있습니다

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

을 PHP 부분까지는 괄호 안에있는 패턴의 일치 항목이 문서마다 matches 배열에 반환됩니다 ((? :와) 사이의 패턴 제외). 그래서 에딘버러는 위에 열거 된 첫 번째 식에 대해 $ matches [2]로 반환되어야합니다.

위의 문자열에 대해 추가 이스케이프가 필요할 수 있습니다. 특히 이중 따옴표로 묶는 경우 특히 그렇습니다.