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 相关文章推荐
ASP和PHP都是可以删除自身的
Apr 09 PHP
PHP strtotime函数详解
Dec 18 PHP
破解.net程序(dll文件)编译和反编译方法
Jan 31 PHP
phplot生成图片类用法详解
Jan 06 PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 PHP
PHP消息队列用法实例分析
Feb 12 PHP
php cookie工作原理与实例详解
Jul 18 PHP
PHP安装memcache扩展的步骤讲解
Feb 14 PHP
PHP7引入的&quot;??&quot;和&quot;?:&quot;的区别讲解
Apr 08 PHP
通过PHP设置BugFree获取邮箱通知
Apr 25 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
Oct 21 PHP
laravel 5.5 关闭token的3种实现方式
Oct 24 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
PHP 高级课程笔记 面向对象
2009/06/21 PHP
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
2016/07/23 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
JQuery Tips(3) 关于$()包装集内元素的改变
2009/12/14 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
使用Python编写vim插件的简单示例
2015/04/17 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
python实现识别相似图片小结
2016/02/22 Python
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
python获取指定时间差的时间实例详解
2017/04/11 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
Python 处理图片像素点的实例
2019/01/08 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
2021/02/06 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
盛大二次面试题
2016/11/18 面试题
化学教师自荐信范文
2013/12/28 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
如何书写邀请函?
2019/06/24 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python