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 相关文章推荐
通过ICQ网关发送手机短信的PHP源程序
Oct 09 PHP
php合并数组array_merge函数运算符加号与的区别
Oct 31 PHP
Zend 输出产生XML解析错误
Mar 03 PHP
PHP 页面编码声明方法详解(header或meta)
Mar 12 PHP
PHP中=赋值操作符对不同数据类型的不同行为
Jan 02 PHP
php.ini中date.timezone设置分析
Jul 29 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
PHP封装CURL扩展类实例
Jul 28 PHP
php redis实现文章发布系统(用户投票系统)
Mar 04 PHP
解决出现SoapFault (looks like we got no XML document)的问题
Jun 24 PHP
PHP项目多语言配置平台实现过程解析
May 18 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数组删除元素示例
2014/03/21 PHP
PHP中使用BigMap实例
2015/03/30 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
javascript 函数使用说明
2010/04/07 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
js 本地预览的简单实现方法
2014/02/18 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
分享一个常用的Python模拟登陆类
2015/03/29 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
Python3 修改默认环境的方法
2019/02/16 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
Python实现结构体代码实例
2020/02/10 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
大学毕业感言50字
2014/02/07 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
房租涨价通知
2015/04/23 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
python内置模块之上下文管理contextlib
2022/06/14 Python