在laravel项目中根据IP获取省市名称

下面由Laravel框架教程栏目给大家介绍根据IP获取省市名称的方法,希望对需要的朋友有所帮助!



根据 ip 获取地理定位,曾尝试了 laravel的torann/geoip 包,不是很准确。还有 百度 API 调用获取地理信息的方法,为了减少维护成本,最终用了thinkphp3.2 中的一个包,是否是tp框架自带的不很清楚。这个包获取定位的原理是内置了省市数据库 UTFWry.dat。



laravel 项目如何使用
我放在了项目 app 同级目录 sdk 下。为了能够使用,composer.json 中需将 IpLocation.class.php 添加到 classmap 自动加载中,以便该文件中包含的类能够在被调用时被自动加载(如果不太明白为何能自动加载,参考 Laravel Composer 自动加载原理)。

1

2

3

4

5

6

"autoload": {

    "classmap": [

        "database/seeds",

        "database/factories",

        "sdk/Org/Net/IpLocation.class.php"

    ]},

添加后执行 composer dump-autoload

基本使用
1

2

3

$ip = new \Org\Net\IpLocation('UTFWry.dat');

$location = $ip->getlocation('223.104.1.100');

dd($location);

1. 标准返回值
我们拿 广东深圳 的 ip 做示例

1

2

3

4

5

6

7

# 打印结果

array:5 [

"ip" => "223.104.1.100"

"beginip" => "223.104.1.0"

"endip" => "223.104.1.255"

"country" => "广东省深圳市"

"area" => "移动"]

2. 个别地区返回值有所不同,左侧为示范ip,右侧为返回地区名称

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# 直辖市

'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 中,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62


 

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;

    }

}

测试

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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

";

foreach ($testips as $ip) {

    print_r(get_ip_location($ip));

}

检查结果

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

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] => 广东深圳

)
已标记关键词 清除标记
相关推荐
<p> <span style="font-size:16px;color:#E53333;"><strong>内容简介:</strong></span> </p> <p> <span style="font-size:16px;">本课程主要是从最基础的技术要点一步一个脚印的介绍Spring Boot2.0相关的核心技术栈,包括如何基于Spring Boot2.0搭建一个企业级的多模块项目、整合Spring MVC和Mybatis实现项目功能模块的CRUD,校验器Validator、Lombok、动态配置参数、开发环境切换、全局异常处理、定时任务、多线程、热加载、发送邮件、上传下载文件、多数据源等核心干货,为各位小伙伴提供企业级项目开发常见且典型的核心技术!</span> </p> <p> <br /> </p> <p> <span style="font-size:16px;color:#E53333;"><strong>其课程大纲如下所示:</strong></span> </p> <p> <img src="https://img-bss.csdn.net/202004070546409819.jpg" alt="" /><span style="font-size:16px;"></span> </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:16px;">在课程的最后,我们介绍并实战了一个典型的应用场景:“<span style="font-size:16px;">用户注册</span>”,主要是将前面章节介绍的内容融入到一个完整的功能模块,做到学以致用!</span><span style="font-size:16px;">其完整的功能流程图如下图所示:</span> </p> <p> <img src="https://img-bss.csdn.net/202004070548344015.png" alt="" /> </p> <p> <span style="font-size:16px;">基本要求:</span> </p> <span style="font-size:16px;"></span> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:16px;">1、</span><span style="font-size:16px;">基本要求:具备一定的</span><span style="font-size:16px;">JavaSE</span><span style="font-size:16px;">以及</span><span style="font-size:16px;">Java Web</span><span style="font-size:16px;">项目的开发基础、了解</span><span style="font-size:16px;">spring boot</span><span style="font-size:16px;">更佳</span><span></span> </p> <p> <span style="font-size:16px;">2、</span><span style="font-size:16px;">工具要求:会使用</span><span style="font-size:16px;">Intellij IDEA </span><span style="font-size:16px;">、</span><span style="font-size:16px;">Navicat </span><span style="font-size:16px;">以及</span><span style="font-size:16px;"> Postman</span> </p>
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页