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常用开发函数解析之数组篇[未完结]
Jul 30 PHP
php对关联数组循环遍历的实现方法
Mar 13 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 PHP
Yii2 rbac权限控制操作步骤实例教程
Apr 29 PHP
Yii2下点击验证码的切换实例代码
Mar 14 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
php curl获取到json对象并转成数组array的方法
May 31 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 PHP
php实例化一个类的具体方法
Sep 19 PHP
php文件上传原理与实现方法详解
Dec 20 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获取url参数方法总结
2014/11/13 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
总结对比php中的多种序列化
2016/08/28 PHP
Laravel 自带的Auth验证登录方法
2019/09/30 PHP
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
ie 7/8不支持trim的属性的解决方案
2014/05/23 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
JavaScript中this的学习笔记及用法整理
2020/02/17 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
2015/02/04 Python
详细解析Python当中的数据类型和变量
2015/04/25 Python
基于Python闭包及其作用域详解
2017/08/28 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
python中scikit-learn机器代码实例
2018/08/05 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
Django密码存储策略分析
2020/01/09 Python
python等差数列求和公式前 100 项的和实例
2020/02/25 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
Skyscanner新西兰:全球领先的旅游搜索网站
2019/08/26 全球购物
台湾良兴购物网:EcLife
2019/12/01 全球购物
放飞中国梦演讲稿
2014/04/23 职场文书
担保书范文
2015/01/20 职场文书
公司年会开场白
2015/06/01 职场文书
商场广播稿范文
2015/08/19 职场文书
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
2022/08/05 Java/Android