ホームページ  >  記事  >  PHPフレームワーク  >  laravelプロジェクトのIPに基づいて州と都市の名前を取得します

laravelプロジェクトのIPに基づいて州と都市の名前を取得します

藏色散人
藏色散人転載
2020-12-11 13:42:491992ブラウズ

次のLaravel Frameworkのチュートリアルコラムでは、IPに基づいて州や都市の名前を取得する方法を紹介します。困っている友達!

laravelプロジェクトのIPに基づいて州と都市の名前を取得します

ip に基づいて地理位置情報を取得するため、laraveltorann/geoip パッケージを試しましたが、あまり正確ではありません。地理情報を取得するメソッドを呼び出す Baidu API もありますが、メンテナンスコストを削減するために、最終的には thinkphp3.2 のパッケージを使用しました。 TP フレームワークを使用します。位置情報を取得するためのこのパッケージの原理は、内蔵の地方自治体データベース UTFWry.dat です。

根据 IP 获取省市名称

#laravel プロジェクトの使用方法

プロジェクトの同じレベルのディレクトリに配置しました

appsdk ダウン。使用するには、IpLocation.class.phpcomposer.jsonclassmap オートロードに追加して、このファイルに含まれるクラスを使用できるようにする必要があります。呼び出されると自動的にロードされます (なぜ自動的にロードできるのかがわからない場合は、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、右側がデモ IP Side は返されたリージョン名です

# 直辖市
'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(&#39;UTFWry.dat&#39;);
    $location = $ip_driver->getlocation($ip);
    $location = $location[&#39;country&#39;]; //广东省深圳市

    // 如果没有查询到的默认返回值
    $default = [&#39;p_id&#39;=>1,&#39;c_id&#39;=>0,&#39;locname&#39;=>&#39;北京&#39;];

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

    // 如果是直辖市,若匹配到直接返回,不继续匹配 “区”
    $spacial = [&#39;北京&#39;,&#39;上海&#39;,&#39;天津&#39;,&#39;重庆&#39;];//北京市/天津市/重庆市/上海市徐汇区
    foreach ($spacial as $bj) {
        if( strpos($location, $bj) !== false ){
            $province_name = $bj;
            $province_id = DB::table(&#39;loc_province&#39;)->where(&#39;name&#39;,$province_name)->value(&#39;province_id&#39;);
            return [&#39;p_id&#39;=>$province_id,&#39;c_id&#39;=>0,&#39;locname&#39;=>$bj.&#39;市&#39;];
        }
    }

    // 其他标准查询
    $expect_ids = [36,37,38,39,69]; //排除北京、、以及想要排除的地区
    $province_name = $city_name = &#39;&#39;; //初始化
    $province_id = $city_id = 0;
    // 所有省数据
    $all_province = DB::table(&#39;loc_province&#39;)->whereNotIn(&#39;id&#39;, $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(&#39;省&#39;,&#39;&#39;,$location);
            // 如果有“市”,那么就提取出市的名称
            if($location && mb_strpos($location, &#39;市&#39;)){
                $city_name = rtrim($location, &#39;市&#39;);
            }
            if($city_name){
                $city_id = DB::table(&#39;loc_city&#39;)->where(&#39;name&#39;,$city_name)->value(&#39;cid&#39;);
            }else{
                $city_id = 1; // 默认省会
            }

            break;
        }
    }

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

テスト

$testips = [
    &#39;223.104.3.155&#39;,//北京市 
    &#39;223.104.7.155&#39;,//天津市 
    &#39;223.104.25.155&#39;,//重庆市 
    &#39;223.104.5.200&#39;,//上海市徐汇区 

    &#39;223.104.15.100&#39;,//内蒙古呼和浩特市 
    &#39;223.104.29.100&#39;,//宁夏银川市 
    &#39;223.104.30.100&#39;,//新疆乌鲁木齐市 
    &#39;211.139.74.100&#39;,//西藏拉萨市 
    &#39;218.204.63.100&#39;,//广西百色市 

    &#39;1.32.192.100&#39;,//香港 
    &#39;60.246.49.100&#39;,//澳门

    &#39;223.104.1.100&#39;, //广东省深圳市
];
echo "<pre class="brush:php;toolbar:false">";
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] => 广东深圳
)
元のアドレス: https://learnku.com/articles/52456 ################                                                                                                     

以上がlaravelプロジェクトのIPに基づいて州と都市の名前を取得しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。