前言

    本文纯干货,直接拿走使用,不用付费。在业务开发中,手机号码验证是我们常常需要面对的问题,目前市场上各种各样的手机号码验证方式,比如正则表达式等等,本文结合实际业务场景,在业务级别对手机号码进行严格验证;同时增加可配置方式,方便业务扩展,代码非常简单,扩展非常灵活。

1. 目前手机号段有哪些
  • 1.1 目前国内的手机号段主要集中在三大运营商手上,还有一些内部号段和虚拟号段
 "中国电信": "133,153,189,180,181,177,173,199,174,141",
"中国移动": "139,138,137,136,135,134,159,158,157,150,151,152,147,188,187,182,183,184,178,198",
"中国联通": "130,131,132,146,156,155,166,186,185,145,175,176",
"虛拟运营商": "170,171",
"内部号码": "123"
2. 建立一个测试项目 Ron.PhoneTest

  • 2.1 将上面的号段加入配置文件 appsettings.json 中
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"phone-segment": {
"中国电信": "133,153,189,180,181,177,173,199,174,141",
"中国移动": "139,138,137,136,135,134,159,158,157,150,151,152,147,188,187,182,183,184,178,198",
"中国联通": "130,131,132,146,156,155,166,186,185,145,175,176",
"虛拟运营商": "170,171",
"内部号码": "123"
}
}
3. 建立一个检查类,负责初始化号段库和校验的工作
    public class PhoneValidator
{
private static readonly Regex checktor = new Regex(@"^1\d{10}$");
public IDictionary segment = null; public PhoneValidator(IDictionary segment)
{
this.segment = segment;
} public bool IsPhone(ref string tel)
{
if (string.IsNullOrEmpty(tel))
{
return false;
} tel = tel.Replace("+86-", "").Replace("+86", "").Replace("86-", "").Replace("-", "");
if (!checktor.IsMatch(tel))
{
return false;
}
string s = tel.Substring(0, 3);
if (segment.Count > 0 && !segment.Contains(s))
{
return false;
} return true;
}
}
4. 通过 Startup.cs 实现读取配置和注入,以便系统使用
        public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); CreatePhoneValidator(services);
} private void CreatePhoneValidator(IServiceCollection services)
{
Hashtable segment = new Hashtable();
var coll = Configuration.GetSection("phone-segment").GetChildren();
foreach (var prefix in coll)
{
if (string.IsNullOrEmpty(prefix.Value))
continue;
foreach (var s in prefix.Value.Split(','))
segment[s] = s;
}
var pv = new PhoneValidator(segment);
services.AddSingleton<PhoneValidator>(pv);
}
  • 以上代码通过读取配置文件节点 phone-segment 并初始化 PhoneValidator 类,最后注入到 IServiceCollection 中,完成了初始化的工作
5. 在控制器中使用 PhoneValidator 进行验证
  • 5.1 示例代码
    [Route("api/home")]
[ApiController]
public class HomeController : ControllerBase
{
PhoneValidator validator = null;
public HomeController(PhoneValidator pv)
{
validator = pv;
} [HttpGet("login")]
public IActionResult Login(string phone)
{
bool accept = validator.IsPhone(ref phone);
return new JsonResult(new { phone, accept });
}
}
  • 5.2 运行项目,在浏览器中输入地址
http://localhost:33868/api/home/login?phone=86-13800138000
  • 5.3 输出结果

结语

  • 通过上面的示例,可以实现对各种各样手机号码的控制,由于号段写在配置文件中,我们可以在业务扩展到时候去动态的增加号段,还可以针对各个地区去扩展 PhoneValidator 类,以实现切合业务的验证需求,从此,手机号码验证不再需要一刀切。

示例代码下载

https://github.com/lianggx/EasyAspNetCoreDemo/tree/master/Ron.PhoneTest

Asp.NetCore轻松学-业务重点-实现一个简单的手机号码验证的更多相关文章

  1. 目录---Asp.NETCore轻松学系列【目录】

    随笔分类 - Asp.NETCore轻松学系列 Asp.NETCore轻松学系列阅读指引目录 摘要: 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进 ...

  2. 【目录】Asp.NETCore轻松学系列

    随笔分类 - Asp.NETCore轻松学系列 Asp.NETCore轻松学系列阅读指引目录 摘要: 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进 ...

  3. Asp.NETCore轻松学系列阅读指引目录

    前言 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进阶,适合没有 .NETCore 编程经验到小白同学,也适合从 .NET Framework 迁移 ...

  4. Asp.NetCore轻松学-使用Supervisor进行托管部署

    前言 上一篇文章 Asp.NetCore轻松学-部署到 Linux 进行托管 介绍了如何在 Centos 上部署自托管的 .NET Core 应用程序,接下来的内容就是介绍如何使用第三方任务管理程序来 ...

  5. Asp.NetCore轻松学-实现一个轻量级高可复用的RabbitMQ客户端

    前言 本示例通过对服务订阅的封装.隐藏细节实现.统一配置.自动重连.异常处理等各个方面来打造一个简单易用的 RabbitMQ 工厂:本文适合适合有一定 RabbitMQ 使用经验的读者阅读,如果你还没 ...

  6. Asp.NetCore轻松学-部署到 IIS 进行托管

    前言 经过一段时间的学习,终于来到了部署服务这个环节,.NetCore 的部署方式非常的灵活多样,但是其万变不离其宗,所有的 Asp.NetCore 程序都基于端口的侦听,在部署的时候仅需要配置侦听地 ...

  7. Asp.NetCore轻松学-部署到 Linux 进行托管

    前言 上一篇文章介绍了如何将开发好的 Asp.Net Core 应用程序部署到 IIS,且学习了进程内托管和进程外托管的区别:接下来就要说说应用 Asp.Net Core 的特性(跨平台),将 .Ne ...

  8. Asp.NetCore轻松学-使用Docker进行容器化托管

    前言 没有 docker 部署的程序是不完整的,在写了 IIS/Centos/Supervisor 3篇托管介绍文章后,终于来到了容器化部署,博客园里面有关于 docker 部署的文章比比皆是,作为硬 ...

  9. Asp.NetCore轻松学-配置服务 apollo 部署实践

    前言     Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置 ...

随机推荐

  1. BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法

    BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...

  2. 猴子 JDFZ模拟赛

    猴子(弱) Description 话说NP做梦,梦见自己变成了一只猴子,并且有很多香蕉树,这些香蕉树都种在同一直线上,而NP则在这排香蕉树的第一棵树上.NP当然想吃尽量多的香蕉,但它又不想在地上走, ...

  3. Ubuntu16.04 下搭建git服务器及gitweb+nginx配置

    本文转自:http://blog.csdn.net/water_horse/article/details/68958140 1.安装所需软件 fengjk@water:~$ sudo apt-get ...

  4. 显著性检测(saliency detection)评价指标之sAUC(shuffled AUC)的Matlab代码实现

    AUC_shuffled.m function [score,tp,fp] = AUC_shuffled(saliencyMap, fixationMap, otherMap, Nsplits, st ...

  5. Python数据结构应用5——排序(Sorting)

    在具体算法之前,首先来看一下排序算法衡量的标准: 比较:比较两个数的大小的次数所花费的时间. 交换:当发现某个数不在适当的位置时,将其交换到合适位置花费的时间. 冒泡排序(Bubble Sort) 这 ...

  6. java可用与串口通信的一些库

    java原生对串口的支持只有javax.comm,javax.comm比较老了,而且不支持64位系统,我在看jlibmodbus(一个java实现的modbus协议栈)的时候发现了几个可供使用的jav ...

  7. (5)STM32使用HAL库实现串口通讯——实战操作

    功能需求: (1)对接收的字符串原样返回(每10个字符一次). (2)发送一个字符串完成后改变LED的状态. 1.创建工程 使用的是F407Discovery,4个LED对应PD12-PD14. (1 ...

  8. 【Python3爬虫】你会怎么评价复仇者联盟4?

    一.写在前面 最近复仇者联盟4正在热映中,很多人都去电影院观看了电影,那么对于这部电影,看过的人都是怎么评价的呢?这时候爬虫就可以派上用场了! 二.主要思路 首先打开豆瓣电影,然后进入复仇者联盟4的详 ...

  9. Django:Python3.6.2+Django2.0配置MySQL

    持续学习Django中... Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据 ...

  10. 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章       STM32H7的HAL库框架设计学 ...