PHP提取字符串中的手机号正则表达式怎么写


Posted in PHP onJuly 17, 2017

0. 简介

PHP通过正则表达式提取字符串中的手机号并判断运营商,简单快速方便,能提取多个手机号。

1. 代码

<?php
header("content-type:text/plain;charset=utf-8");
function findThePhoneNumbers($oldStr = ""){
  // 检测字符串是否为空
  $oldStr=trim($oldStr);
  $numbers = array();
  if(empty($oldStr)){
    return $numbers;
  }
  // 删除86-180640741122,0997-8611222之类的号码中间的减号(-)
  $strArr = explode("-", $oldStr);
  $newStr = $strArr[0];
  for ($i=1; $i < count($strArr); $i++) { 
    if (preg_match("/\d{2}$/", $newStr) && preg_match("/^\d{11}/", $strArr[$i])){
      $newStr .= $strArr[$i]; 
    } elseif (preg_match("/\d{3,4}$/", $newStr) && preg_match("/^\d{7,8}/", $strArr[$i])) {
      $newStr .= $strArr[$i]; 
    } else {
      $newStr .= "-".$strArr[$i]; 
    } 
  }
  // 手机号的获取
  $reg='/\D(?:86)?(\d{11})\D/is';//匹配数字的正则表达式
  preg_match_all($reg,$newStr,$result);
  $nums = array();
  // * 中国移动:China Mobile
  // * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
  $cm = "/^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\d)\d{7}$/";
  // * 中国联通:China Unicom
  // * 130,131,132,152,155,156,185,186
  $cu = "/^1(3[0-2]|5[256]|8[56])\d{8}$/";
  // * 中国电信:China Telecom
  // * 133,1349,153,180,189
  $ct = "/^1((33|53|8[09])[0-9]|349)\d{7}$/";
  //
  foreach ($result[1] as $key => $value) {
    if(preg_match($cm,$value)){
      $nums[] = array("number" => $value, "type" => "中国移动");
    }elseif(preg_match($cu,$value)){
      $nums[] = array("number" => $value, "type" => "中国联通");
    }elseif(preg_match($ct,$value)){
      $nums[] = array("number" => $value, "type" => "中国电信");
    }else{
      // 非法号码
    }
  }
  $numbers["mobile"] = $nums;
  // 固定电话或小灵通的获取
  $reg='/\D(0\d{10,12})\D/is';//匹配数字的正则表达式
  preg_match_all($reg,$newStr,$result);
  $nums = array();
  // * 大陆地区固定电话或小灵通
  // * 区号:010,020,021,022,023,024,025,027,028,029
  // * 号码:七位或八位
  $phs = "/^0(10|2[0-5789]|\d{3})\d{7,8}$/";
  foreach ($result[1] as $key => $value) {
    if(preg_match($phs, $value)){
      $nums[] = array("number" => $value, "type" => "固定电话或小灵通");
    } else {
      // 非法
    }
  }
  $numbers["landline"] = $nums;
  // 有可能是没有区号的固定电话的获取
  $reg='/\D(\d{7,8})\D/is';//匹配数字的正则表达式
  preg_match_all($reg,$newStr,$result);
  $nums = array();
  foreach ($result[1] as $key => $value) {
    $nums[] = array("number" => $value, "type" => "没有区号的固定电话");
  }
  $numbers["possible"] = $nums;
  // 返回最终数组
  return $numbers;
}
// 测试数据
$str = "this(8625010) is a number, and the another is here(09978625000) ,the phone number is 18064074452 and 13899555555。这是中文,这里有个13239323232的手机号,还有一个188779988441这是12位8613322114455的。这里又是一个手机号86-18064074455。还有一个区号分开写的0997-8625001hahaha";
$nums = findThePhoneNumbers($str);
print_r($nums);

2. 测试结果

Array
(  [mobile] => Array
    (
      [0] => Array
        (
          [number] => 18064074452
          [type] => 中国电信
        )
      [1] => Array
        (
          [number] => 13899555555
          [type] => 中国移动
        )
      [2] => Array
        (
          [number] => 13239323232
          [type] => 中国联通
        )
      [3] => Array
        (
          [number] => 13322114455
          [type] => 中国电信
        )
      [4] => Array
        (
          [number] => 18064074455
          [type] => 中国电信
        )
    )
  [landline] => Array
    (
      [0] => Array
        (
          [number] => 09978625000
          [type] => 固定电话或小灵通
        )
      [1] => Array
        (
          [number] => 09978625001
          [type] => 固定电话或小灵通
        )
    )
  [possible] => Array
    (
      [0] => Array
        (
          [number] => 8625010
          [type] => 没有区号的固定电话
        )
    )
)

3. 结果解析

mobile 移动电话号码
landline 固定电话或者小灵通
possible 可能是没有区号的固定电话

以上所述是小编给大家介绍的PHP提取字符串中的手机号正则表达式怎么写,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP和.net中des加解密的实现方法
Feb 27 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
Sep 10 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
Jan 07 PHP
递归实现php数组转xml的代码分享
May 14 PHP
php基于双向循环队列实现历史记录的前进后退等功能
Aug 08 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
Dec 18 PHP
Yii2.0中使用js异步删除示例
Mar 10 PHP
PHP数组去重的更快实现方式分析
May 09 PHP
PHP实现百度人脸识别
May 06 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 #PHP
PHPstorm快捷键(分享)
Jul 17 #PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 #PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 #PHP
Laravel网站打开速度优化的方法汇总
Jul 16 #PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 #PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 #PHP
You might like
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
PHP查询快递信息的方法
2015/03/07 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
Jquery多选框互相内容交换的实例代码
2013/07/04 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
2016/10/19 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
详解Python的循环结构知识点
2019/05/20 Python
Python itertools.product方法代码实例
2020/03/27 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
html5图片上传预览示例分享
2014/04/14 HTML / CSS
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
初二政治教学反思
2014/01/12 职场文书
服务员自我评价
2014/01/25 职场文书
《小草和大树》教学反思
2014/02/16 职场文书
意向协议书范本
2014/04/23 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
杜甫草堂导游词
2015/02/03 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
初二英语教学反思
2016/02/15 职场文书
Nginx快速入门教程
2021/03/31 Servers
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python