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实现WEB动态网页静态
Oct 09 PHP
PHP UTF8编码内的繁简转换类
Jul 20 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
Jul 02 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
服务器变量 $_SERVER 的深入解析
Jul 02 PHP
php 发送带附件邮件示例
Jan 23 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
PHP以mysqli方式连接类完整代码实例
Jul 15 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
php检查页面是否被百度收录
Oct 28 PHP
php5.3后静态绑定用法详解
Nov 11 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
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
原生javascript实现无间缝滚动示例
2014/01/28 Javascript
DOM基础教程之使用DOM
2015/01/19 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
2017/01/13 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
python自动化之Ansible的安装教程
2019/06/13 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
残疾人小组计划书
2014/04/27 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
水污染治理工程专业求职信
2014/06/14 职场文书
创新社会管理心得体会
2014/09/12 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
家长通知书家长意见
2015/06/03 职场文书
任命书格式范文
2015/09/22 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
python3 删除所有自定义变量的操作
2021/04/08 Python
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
Grafana可视化监控系统结合SpringBoot使用
2022/04/19 Redis
Java数据结构之堆(优先队列)
2022/05/20 Java/Android