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更改目录及子目录下所有的文件后缀扩展名的代码
Oct 12 PHP
8个出色的WordPress SEO插件收集
Feb 26 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
thinkphp四种url访问方式详解
Nov 28 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
Dec 16 PHP
PHP内存使用情况如何获取
Oct 10 PHP
纯PHP代码实现支付宝批量付款
Dec 24 PHP
PHP与服务器文件系统的简单交互
Oct 21 PHP
php中时间函数date及常用的时间计算
May 12 PHP
PHP读取Excel类文件
May 15 PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 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和MySQL保存和输出图片
2006/10/09 PHP
php中$this-&amp;gt;含义分析
2009/11/29 PHP
PHP源码之explode使用说明
2011/08/05 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
Bootstrap3多级下拉菜单
2017/02/24 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
Python函数学习笔记
2008/10/07 Python
Python使用Flask框架同时上传多个文件的方法
2015/03/21 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
python 实现客户端与服务端的通信
2020/12/23 Python
Python爬取某平台短视频的方法
2021/02/08 Python
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
html5读取本地文件示例代码
2014/04/22 HTML / CSS
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
美国电子产品折扣网站:Daily Steals
2017/05/20 全球购物
机电一体化专业推荐信
2013/12/03 职场文书
超级搞笑检讨书
2014/01/15 职场文书
端午节活动总结报告
2015/02/11 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python