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操作mysql函数详解,mysql和php交互函数
May 19 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
深入理解php的MySQL连接类
Jun 07 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
Jul 02 PHP
php用ini_get获取php.ini里变量值的方法
Mar 04 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
PHP单例模式详解及实例代码
Dec 21 PHP
PHP面向对象程序设计类的定义与用法简单示例
Dec 27 PHP
php将html转为图片的实现方法
May 19 PHP
PHP中phar包的使用教程
Jun 14 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
PHP基于面向对象封装的分页类示例
Mar 15 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调用Java对象的方法
2006/10/09 PHP
PHP使用逆波兰式计算工资的方法
2015/07/29 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
js prototype截取字符串函数
2010/04/01 Javascript
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
js和as的稳定传值问题解决
2013/07/14 Javascript
js调用图片隐藏&amp;显示实现代码
2013/09/13 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
iview form清除校验状态的实现
2019/09/19 Javascript
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
python 负数取模运算实例
2020/06/03 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
加热夹克:RAVEAN
2018/10/19 全球购物
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
临床医学专业学生的自我评价分享
2013/11/21 职场文书
农业资源与环境专业自荐信范文
2013/12/30 职场文书
手机促销活动方案
2014/02/05 职场文书
教师节商场活动方案
2014/02/13 职场文书
企业宣传工作方案
2014/06/02 职场文书
路政管理求职信
2014/06/18 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js