2010-06-27 30 views
5

Làm thế nào tôi sẽ sử dụng Regex để có được thông tin về một IP để Location APIPHP Regex cho IP để Location API

Đây là API

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

tôi sẽ cần phải nhận được Tên Nước , Vùng/Tiểu bang và Thành phố.

Tôi cố gắng này:

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

Khi tôi làm echo $ regex tôi luôn luôn nhận được FAIL làm thế nào tôi có thể sửa lỗi này

Trả lời

3

Như Aaron đã đề xuất. Tốt nhất là không phát minh lại bánh xe vì vậy hãy thử phân tích nó với 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); 

Bây giờ bạn có thể truy cập vào bất kỳ phần nào của biến $ xml như một đối tượng, với điều đó về vấn đề ở đây là một ví dụ về những gì bạn được đăng.

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

Bây giờ sau khi bạn đã tải chuỗi XML này vào simplexml_load_string(), bạn có thể truy cập địa chỉ IP của phản hồi như vậy.

$xml->IP; 

simplexml_load_string() sẽ biến đổi cũng thành các tệp XML thành đối tượng mà bạn có thể thao tác. Chỉ khác điều tôi có thể nói là đi và thử nó ra và chơi với nó

EDIT:

Nguồn http://www.php.net/manual/en/function.simplexml-load-string.php

+1

Hoặc đơn giản: '$ xml = simplexml_load_file ($ url);' – salathe

+0

Ngữ nghĩa ;-) đó là ví dụ thực tế duy nhất tôi đã đặt khoảng – WarmWaffles

2

Bạn thực sự là nên sử dụng một phân tích cú pháp XML để kéo thông tin.

Ví dụ: this script sẽ phân tích cú pháp thành mảng.

Regex thực sự không nên được sử dụng để phân tích cú pháp HTML hoặc XML.

+0

Vui lòng đăng một ví dụ! – xZerox

+0

Đã cập nhật cho bạn. =) –

1

Nếu bạn thực sự cần phải sử dụng biểu thức thông thường, sau đó bạn nên sửa một trong những bạn đang sử dụng. "|<CountryName>([^<]*)</CountryName>|i" sẽ hoạt động tốt hơn.

+0

Theo báo cáo từ những người khác, tôi không muốn sử dụng cụm từ thông dụng để phân tích cú pháp HTML, XHTML hoặc XML nếu không có trong một số trường hợp cụ thể. Tôi đã nhanh chóng xác minh xem nội dung XML được trả lại có chứa thẻ hay không, và tôi đã sử dụng cụm từ thông dụng; đối với các trường hợp khác, tốt hơn là sử dụng SimpleXML, nếu XML trả về không quá lớn. – kiamlaluno