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编程效率 引入缓存机制提升性能
Feb 15 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
php header功能的使用
Oct 28 PHP
sae使用smarty模板的方法
Dec 17 PHP
跟我学Laravel之视图 &amp; Response
Oct 15 PHP
护卫神php套件 php版本升级方法(php5.5.24)
May 10 PHP
php中PDO方式实现数据库的增删改查
May 17 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
Thinkphp单字母函数使用指南
May 08 PHP
php传值方式和ajax的验证功能
Mar 27 PHP
YII框架常用技巧总结
Apr 27 PHP
PHP的Trait机制原理与用法分析
Oct 18 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
基于header的一些常用指令详解
2013/06/06 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
javascript编码的几个方法详细介绍
2013/01/06 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
java必学必会之static关键字
2015/12/03 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
简单实现js鼠标跟随效果
2020/08/02 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
详解python之简单主机批量管理工具
2017/01/27 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
美国性感女装网站:bebe
2017/03/04 全球购物
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
电脑教师的自我评价
2013/12/18 职场文书
本科生的职业生涯规划范文
2014/01/09 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
计算机专业求职信
2014/06/02 职场文书
土建施工员岗位职责
2014/07/16 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
python超详细实现完整学生成绩管理系统
2022/03/17 Python