中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在laravel項目中根據IP獲取省市名稱的方法

發布時間:2020-12-15 10:52:53 來源:億速云 閱讀:239 作者:小新 欄目:編程語言

這篇文章主要介紹在laravel項目中根據IP獲取省市名稱的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

根據 ip 獲取地理定位,曾嘗試了 laraveltorann/geoip 包,不是很準確。還有 百度 API 調用獲取地理信息的方法,為了減少維護成本,最終用了thinkphp3.2 中的一個包,是否是tp框架自帶的不很清楚。這個包獲取定位的原理是內置了省市數據庫 UTFWry.dat

在laravel項目中根據IP獲取省市名稱的方法

laravel 項目如何使用

我放在了項目 app 同級目錄 sdk 下。為了能夠使用,composer.json 中需將 IpLocation.class.php 添加到 classmap 自動加載中,以便該文件中包含的類能夠在被調用時被自動加載(如果不太明白為何能自動加載,參考 Laravel Composer 自動加載原理)。

"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories",
        "sdk/Org/Net/IpLocation.class.php"
    ]},

添加后執行 composer dump-autoload

基本使用

$ip = new \Org\Net\IpLocation('UTFWry.dat');
$location = $ip->getlocation('223.104.1.100');
dd($location);

1. 標準返回值
我們拿 廣東深圳 的 ip 做示例

# 打印結果
array:5 [
"ip" => "223.104.1.100"
"beginip" => "223.104.1.0"
"endip" => "223.104.1.255"
"country" => "廣東省深圳市"
"area" => "移動"]

2. 個別地區返回值有所不同,左側為示范ip,右側為返回地區名稱

# 直轄市
'223.104.3.155',//北京市 
'223.104.7.155',//天津市 
'223.104.25.155',//重慶市 
'223.104.5.200',//上海市徐匯區 
# 自治區
'223.104.15.100',//內蒙古呼和浩特市 
'223.104.29.100',//寧夏銀川市 
'223.104.30.100',//新疆烏魯木齊市 
'211.139.74.100',//西藏拉薩市 
'218.204.63.100',//廣西百色市 

'1.32.192.100',//香港 
'60.246.49.100',//澳門

封裝一個返回地區id的方法函數

經常使用的話,一般喜歡放在 app\Helpers.php 中,

<?php

function get_ip_location($ip){
    $ip_driver = new \Org\Net\IpLocation('UTFWry.dat');
    $location = $ip_driver->getlocation($ip);
    $location = $location['country']; //廣東省深圳市

    // 如果沒有查詢到的默認返回值
    $default = ['p_id'=>1,'c_id'=>0,'locname'=>'北京'];

    // 如果有市 那么市后邊的字符刪除 只保留到市
    $city_strpos = mb_strpos($location, '市');
    if($city_strpos){
        $location = mb_substr($location, 0, $city_strpos + 1);
    }

    // 如果是直轄市,若匹配到直接返回,不繼續匹配 “區”
    $spacial = ['北京','上海','天津','重慶'];//北京市/天津市/重慶市/上海市徐匯區
    foreach ($spacial as $bj) {
        if( strpos($location, $bj) !== false ){
            $province_name = $bj;
            $province_id = DB::table('loc_province')->where('name',$province_name)->value('province_id');
            return ['p_id'=>$province_id,'c_id'=>0,'locname'=>$bj.'市'];
        }
    }

    // 其他標準查詢
    $expect_ids = [36,37,38,39,69]; //排除北京、、以及想要排除的地區
    $province_name = $city_name = ''; //初始化
    $province_id = $city_id = 0;
    // 所有省數據
    $all_province = DB::table('loc_province')->whereNotIn('id', $expect_ids)->get();
    foreach ($all_province as $prov) {
        $name = $prov->name;
        $prov_pos = mb_strpos($location, $name);
        // 如果匹配到目標
        if( $prov_pos !== false ){
            $province_id = $prov->province_id;
            $province_name = $name;
            // 從字符串中去除省名稱,并把省字去掉
            $location = mb_substr($location, $prov_pos + mb_strlen($name));
            $location = str_replace('省','',$location);
            // 如果有“市”,那么就提取出市的名稱
            if($location && mb_strpos($location, '市')){
                $city_name = rtrim($location, '市');
            }
            if($city_name){
                $city_id = DB::table('loc_city')->where('name',$city_name)->value('cid');
            }else{
                $city_id = 1; // 默認省會
            }

            break;
        }
    }

    if($province_name){
        return  ['p_id'=>$province_id,'c_id'=>$city_id,'locname'=>$province_name.$city_name];
    }else{
        return $default;
    }
}

測試

$testips = [
    '223.104.3.155',//北京市 
    '223.104.7.155',//天津市 
    '223.104.25.155',//重慶市 
    '223.104.5.200',//上海市徐匯區 

    '223.104.15.100',//內蒙古呼和浩特市 
    '223.104.29.100',//寧夏銀川市 
    '223.104.30.100',//新疆烏魯木齊市 
    '211.139.74.100',//西藏拉薩市 
    '218.204.63.100',//廣西百色市 

    '1.32.192.100',//香港 
    '60.246.49.100',//澳門

    '223.104.1.100', //廣東省深圳市
];
echo "<pre>";
foreach ($testips as $ip) {
    print_r(get_ip_location($ip));
}

檢查結果

Array
(
    [p_id] => 1
    [c_id] => 0
    [locname] => 北京市
)
Array
(
    [p_id] => 3
    [c_id] => 0
    [locname] => 天津市
)
Array
(
    [p_id] => 4
    [c_id] => 0
    [locname] => 重慶市
)
Array
(
    [p_id] => 2
    [c_id] => 0
    [locname] => 上海市
)
Array
(
    [p_id] => 7
    [c_id] => 1
    [locname] => 內蒙古呼和浩特
)
Array
(
    [p_id] => 29
    [c_id] => 1
    [locname] => 寧夏銀川
)
Array
(
    [p_id] => 31
    [c_id] => 1
    [locname] => 新疆烏魯木齊
)
Array
(
    [p_id] => 26
    [c_id] => 1
    [locname] => 西藏拉薩
)
Array
(
    [p_id] => 21
    [c_id] => 13
    [locname] => 廣西百色
)
Array
(
    [p_id] => 32
    [c_id] => 1
    [locname] => 香港
)
Array
(
    [p_id] => 33
    [c_id] => 1
    [locname] => 澳門
)
Array
(
    [p_id] => 20
    [c_id] => 2
    [locname] => 廣東深圳
)

以上是“在laravel項目中根據IP獲取省市名稱的方法”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兰考县| 涿鹿县| 龙岩市| 乌兰县| 钟山县| 阳山县| 宜黄县| 南宫市| 丁青县| 图们市| 鄂州市| 桐梓县| 东港市| 兴文县| 浦江县| 亚东县| 沭阳县| 漯河市| 自治县| 宁明县| 山东省| 南阳市| 都昌县| 信丰县| 深州市| 平山县| 吉木萨尔县| 工布江达县| 仲巴县| 龙山县| 建湖县| 栾城县| 安化县| 沁源县| 丹巴县| 平塘县| 盐山县| 宁阳县| 陵川县| 旌德县| 永胜县|