原文:业务重点-实现一个简单的手机号码验证

前言

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

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://files.cnblogs.com/files/viter/Ron.PhoneTest.zip

业务重点-实现一个简单的手机号码验证相关推荐

  1. Asp.NetCore实现一个简单的手机号码验证

    前言     本文纯干货,直接拿走使用,不用付费.在业务开发中,手机号码验证是我们常常需要面对的问题,目前市场上各种各样的手机号码验证方式,比如正则表达式等等,本文结合实际业务场景,在业务级别对手机号 ...

  2. 从零开始,搭建一个简单的UVM验证平台(一)

    前言: 这篇系列将从0开始搭建一个UVM验证平台,来帮助一些学习了SV和UVM知识,但对搭建完整的验证环境没有概念的朋友. UVM前置基础: 1.UVM基础-factory机制.phase机制 2.U ...

  3. 【IOS】利用ASIHTTPRequest 实现一个简单的登陆验证

    [原创作品, 欢迎转载,转载请在明显处注明! 谢谢. 原文地址:http://blog.csdn.net/toss156/article/details/7638529] 今天给大家带来一个简单的登陆 ...

  4. 诙谐有趣的《UVM实战》笔记——第二章 一个简单的UVM验证平台

    前言 某天白天在地铁上听鬼故事,结果晚上要睡觉时,故事里的情节都历历在目,给我鸡皮疙瘩起的~ 不过我倒是没有吓得睡不着,而是转念一想,为啥我学知识忘得很快,随便听的鬼故事却记得这么清楚咧? 那如果能像 ...

  5. 一个简单的UVM验证平台

    2.1 验证平台的组成 2.1.1. 何谓验证平台 何谓验证平台?验证最基本的目的在于测试 DUT 的正确性,其最常使用的方法就是给 DUT 施加不同的输入(激励),所以一个验证平台最重要的的功能在于 ...

  6. 一个简单的网络验证分析(菜鸟)

    http://bbs.pediy.com/showthread.php?t=45356&highlight=%E7%BD%91%E7%BB%9C+%E7%BB%9C%E9%AA%8C+%E9% ...

  7. 【UVM实战】第二章:一个简单的UVM验证平台(4)UVM 的终极大作:sequence

    文章目录 2.4.1.在验证平台中加入sequencer 2.4.2.sequence机制 2.4.3.default_sequence的使用 2.4.1.在验证平台中加入sequencer sequ ...

  8. Jquery一个简单的注册验证

    我叫小星 2016-11-23 18:27 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  9. 用tp5写了一个简单的登录验证

    前台的代码     <div class="main">         <div class="login-form fr">    ...

  10. PERL-MOJO写一个简单的登录验证页面

    PERL果然是很牛掰的东西...   失业三年半了.还是想keep一下perl的兴趣. use Mojolicious::Lite;my $password='1253';get '/login' = ...

最新文章

  1. [AI开发]目标检测之素材标注
  2. Find Familiar Service Features in Lightning Experience
  3. python三级联动菜单_详解element-ui级联菜单(城市三级联动菜单)和回显问题
  4. reactjs jsx语法规则
  5. 代码覆盖率测试工具:gcov和lcov的使用
  6. SSH整合注解版(Spring+Struts2+Hibernate)
  7. java args eclipse_不会在eclipse中运行含有args[]参数的Java代码,求指导
  8. 模糊匹配查询_必须掌握的6个查询函数应用技巧,办公必备,收藏备用!
  9. window python环境搭建_Python入门-环境搭建详解(Window平台)
  10. 2017马哥python高级实战班 培训推荐
  11. 北斗卫星导航系统介绍
  12. 记录学习使用vue2.0请求qq音乐歌手数据
  13. 计算机本地网络给手机使用吗,手机网络也能共享给电脑(台式or笔记本)使用吗?...
  14. [边缘检测算法] Sobel算子及其PC端优化提速20几倍
  15. win32 opengl画线
  16. 电脑重装系统后文件还能恢复吗?恢复文件的详细图文教程
  17. java get/set方法好处
  18. Windows系统配置
  19. java和dba哪个好_你的性格适合做DBA吗?面试者必看
  20. 全国计算机等级考试一级大纲,全国计算机等级考试大纲(一级WIN)

热门文章

  1. 图像分类数据集(Fashion-MNIST)
  2. oracle转为纯大写,Oracle认证:oracle中小写转换成大写方法
  3. java的css的块_CSS基础知识(概念、块级元素、行内元素、选择器)
  4. Two sum (bilibili有讲解视频)
  5. 机器学习算法性能评价,改进的理论基础以及改进措施
  6. MVC设计模式:概念,模型,视图,控制器
  7. python 环形图_Python通过matplotlib画双层饼图及环形图简单示例
  8. 凸优化第三章凸函数 3.6关于广义不等式的凸性
  9. tdoa/aoa定位的扩展卡尔曼滤波定位算法matlab源码,03TDOA_AOA定位的扩展卡尔曼滤波算法MATLAB源代码...
  10. CONTINUAL LEARNING FOR AUTOMATED AUDIO CAPTIONING USING THE LEARNING WITHOUT FORGETTING APPROACH