在 Web 開發中,根據 IP 地址查詢地理位置是常見需求。本文展示一個簡單的 PHP 範例,透過抓取 ip138.com 的公開查詢介面,解析回傳的 HTML 內容以獲取 IP 歸屬資訊。
<?php
header('Content-Type: text/html; charset=utf-8');
$ip = isset($_GET['ip']) ? trim($_GET['ip']) : '';
$msg = '';
if (isset($_GET['sub']) && $ip) {
ipSearch($ip, $msg);
}
function ipSearch(string $ip, string &$msg) {
// 1. 基本格式驗證
if (substr_count($ip, '.') !== 3) {
$msg = '無效 IP 格式,請輸入類似 192.168.1.1 的地址!';
return;
}
$long = ip2long($ip);
if ($long === false || $long === -1) {
$msg = '無效 IP 地址,請重新輸入!';
return;
}
// 2. 獲取遠端內容(注意:ip138 回傳 GB2312 編碼)
$url = "https://www.ip138.com/ips1388.asp?action=2&ip={$ip}";
$content = @file_get_contents($url);
if ($content === false) {
$msg = '無法連線至查詢服務,請稍後再試。';
return;
}
// 3. 編碼轉換:GB2312 -> UTF-8
$content = iconv('GB2312', 'UTF-8//IGNORE', $content);
// 4. 解析目標片段
$startTag = 'substr_count() 檢查點號數量,配合 ip2long() 驗證合法性。iconv() 轉為 UTF-8 避免亂碼。stripos)定位特徵標籤,再截取內容。此法簡單但脆弱,頁面結構變更即會失效。@file_get_contents 抑制警告,配合條件判斷給予友善提示。cURL 替代 file_get_contents,支援超時控制、HTTPS、Header 設定等。MaxMind GeoIP2、ip2region、QQWry.dat)實現離線高效查詢,不依賴第三方介面穩定性。htmlspecialchars() 轉義,防範 XSS 攻擊(範例已補全)。本範例演示了呼叫外部 API 並解析 HTML 回應的基本流程。實際專案中強烈建議採用離線 IP 庫或正規商業 API,以獲得更高的可用性、準確度與效能。