zhangjingyu
经测试,https://whois.pconline.com.cn/ipJson.jsp?ip=39.78.172.154可用。那么,怎么把addr后面的归属地提取出来呢?
根据您提供的API返回内容,提取 addr 字段的归属地信息非常简单。这个接口返回的是 JSONP 格式数据(一个JavaScript函数调用),您需要先从中提取出JSON部分再解析。
✅ 最直接的方法:使用正则匹配提取 addr 值
php
function getLocationFromPconline($ip) {
$url = "https://whois.pconline.com.cn/ipJson.jsp?ip={$ip}";
// 初始化cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
$response = curl_exec($ch);
curl_close($ch);
if (!$response) {
return false;
}
// 方法1:直接正则匹配addr的值(最简洁)
// 匹配 "addr":"..." 中的内容,注意处理中文
if (preg_match('/"addr":"([^"]+)"/', $response, $matches)) {
$addr = $matches[1];
// 可选:将Unicode转义序列(如\uXXXX)转换为中文
$addr = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function($match) {
return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
}, $addr);
return $addr;
}
return false;
}
// 使用示例
$ip = '39.78.172.154';
$location = getLocationFromPconline($ip);
echo $location; // 输出: 山东省济南市 联通
🛠️ 备选方案:JSON解析法(更严谨)
如果需要提取多个字段,可以先提取JSON部分再解析:
php
function getIpInfoFromPconline($ip) {
$url = "https://whois.pconline.com.cn/ipJson.jsp?ip={$ip}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
// 提取函数调用中的JSON字符串
if (preg_match('/IPCallBack\(({.+})\)/', $response, $matches)) {
$jsonStr = $matches[1];
$data = json_decode($jsonStr, true);
if ($data && isset($data['addr'])) {
return $data['addr']; // 返回完整地址
// 或只返回省份+城市: $data['pro'] . $data['city']
}
}
return false;
}
📦 集成到您原有的函数中
您可以把这个作为备选方案,当 ip.cn 失效时自动切换:
php
function getipguishu($onlineip) {
// ... 原有的数据库查询和ip.cn逻辑 ...
// 如果ip.cn失败,尝试pconline
if (empty($guishudi)) {
$guishudi = getLocationFromPconline($onlineip);
}
return $guishudi;
}

