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 相关文章推荐
数据库相关问题
Oct 09 PHP
PHP中上传大体积文件时需要的设置
Oct 09 PHP
PHP 中dirname(_file_)讲解
Mar 18 PHP
php zend解密软件绿色版测试可用
Apr 14 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
Apr 17 PHP
php中count获取多维数组长度的方法
Nov 03 PHP
PHP Try-catch 语句使用技巧
Feb 28 PHP
php实现基于PDO的预处理示例
Mar 28 PHP
php封装一个异常的处理类
Jun 08 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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服务器实现多session并发运行
2006/10/09 PHP
PHP实现MySQL更新记录的代码
2008/06/07 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
javascript 函数使用说明
2010/04/07 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
Ajax基础知识详解
2017/02/17 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
python调用cmd命令行制作刷博器
2014/01/13 Python
python测试驱动开发实例
2014/10/08 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
python对XML文件的操作实现代码
2020/03/27 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
selenium+python实现基本自动化测试的示例代码
2021/01/27 Python
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
EJB的激活机制
2013/10/25 面试题
打架检讨书100字
2014/01/08 职场文书
学生思想表现的评语
2014/01/30 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
三好学生事迹材料
2014/12/24 职场文书