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 相关文章推荐
mysql 搜索之简单应用
Apr 27 PHP
PHP 递归效率分析
Nov 24 PHP
PHP开发需要注意的安全问题
Sep 01 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
May 14 PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 PHP
php打开文件fopen函数的使用说明
Jul 05 PHP
php实现RSA加密类实例
Mar 26 PHP
php 指定范围内多个随机数代码实例
Jul 18 PHP
示例详解Laravel的注册重构
Aug 14 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
PHP实现的简单在线计算器功能示例
Aug 02 PHP
Ajax请求PHP后台接口返回信息的实例代码
Aug 21 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编码规范-php coding standard
2007/03/16 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
PHP正则验证Email的方法
2015/06/15 PHP
经常用到的JavasScript事件的翻译
2007/04/09 Javascript
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
vue 实现特定条件下绑定事件
2019/11/09 Javascript
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
Python CSV模块使用实例
2015/04/09 Python
python添加模块搜索路径方法
2017/09/11 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
如何教少儿学习Python编程
2020/07/10 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
数据员岗位职责
2013/11/19 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
确保工程质量承诺书
2015/04/29 职场文书
五一晚会主持词
2015/07/01 职场文书
清明节随笔
2015/08/15 职场文书
大学副班长竞选稿
2015/11/21 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
Go语言应该什么情况使用指针
2021/07/25 Golang