PHP提取字符串中的手机号正则表达式怎么写

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提取字符串中的手机号正则表达式怎么写,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • php 正则 不包含某字符串的正则表达式

    常见函数 strstr($str, "abc"); 正则匹配 preg_match("/(abc)?/is", $str); 但是要匹配一个字符串中,不包含某字符串,用正则就比较麻烦了 如果不用正则 !strstr($str, "abc"); 就可以解决问题了 但是用正则呢,就只有这样了,"/^((?!abc).)*$/is" //------------------------------------------------

  • php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串

    复制代码 代码如下: $str="你好<我>(爱)[北京]{天安门}"; echo f1($str); //返回你好 echo f2($str); //返回我 echo f3($str); //返回爱 echo f4($str); //返回北京 echo f5($str); //返回天安门 function f1($str) { $result = array(); preg_match_all("/^(.*)(?:<)/i",$str, $res

  • php中字符串和正则表达式详解

    一.字符串类型的特点 1.PHP是弱类型语言,其他数据类型一般都可以直接应用于字符串函数操作. <?phpecho substr("123456",2,4);  //输出345echo substr(123456,2,4);    //输出345echo hello;                 //先查找hello常量,若没找到,将hello看做字符串使用?> 2.字符串可以作为"数组",是字符的集合. <?php$str = "w

  • PHP中用正则表达式清除字符串的空白

    如果您想要去掉字符串开始和结束的空白可以使用PHP内部函数trim() .但是, 我们经常想完全清除空白.需要把开始和结束的空白清除掉,将多个空白变为一个空白,使用一个规则来处理同样的类型的其它空白. 完成这些可以使用PHP的正则表达式来完成 下例可以去除额外Whitespace 复制代码 代码如下: <?php $str = " This line contains\tliberal \r\n use of whitespace.\n\n"; // First remove t

  • PHP提取字符串中的图片地址[正则表达式]

    复制代码 代码如下: <?php $str='<p><img border="0" src="upfiles/2009/07/1246430143_1.jpg" alt=""/></p>'; $pattern="/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/"; preg_

  • php 手机号码验证正则表达式

    比较简洁的代码一: $str = ''; $isMatched = preg_match('/^0?(13|14|15|17|18)[0-9]{9}$/', $str, $matches); var_dump($isMatched, $matches); 代码二 <?php //正则表达式 $tel = "15558530459"; //作者的手机号码,如果有疑问可以电话联系我,或者QQ联系我,我的QQ是mezongzi@qq.com if (strlen($tel) == &q

  • PHP提取字符串中的手机号正则表达式怎么写

    0. 简介 PHP通过正则表达式提取字符串中的手机号并判断运营商,简单快速方便,能提取多个手机号. 1. 代码 <?php header("content-type:text/plain;charset=utf-8"); function findThePhoneNumbers($oldStr = ""){ // 检测字符串是否为空 $oldStr=trim($oldStr); $numbers = array(); if(empty($oldStr)){ r

  • java基于正则提取字符串中的数字功能【如提取短信中的验证码】

    本文实例讲述了java基于正则提取字符串中的数字功能.分享给大家供大家参考,具体如下: 使用Java正则可以很方便的从字符串中提取符合条件的内容. 1.提取字符串中所有的手机号: private void getPhoneNum(String smsBody) { Pattern pattern = Pattern.compile("(13|14|15|18)\\d{9}"); Matcher matcher = pattern.matcher(smsBody); while (mat

  • 如何利用python提取字符串中的数字

    目录 一.isdigit()函数 二.filter() 函数 三.提取一段字符串中的数字 四.匹配指定字符串开头的数字 五.匹配时间,17:35:24 六.匹配时间,20181011 15:28:39 总结 一.isdigit()函数 isdigit()函数是检测输入字符串是否只由数字组成.如果字符串只包含数字则返回 True 否则返回 False. dream = "123456" print(dream.isdigit()) # 返回:True dream = "123a

  • php提取字符串中网站url地址的方法

    本文实例讲述了php提取字符串中网站url地址的方法.分享给大家供大家参考.具体分析如下: 今天写一个问答系统上线之后发现有很多人发链接了,由于业务部门要我们过滤掉网站地址了,下面我给大家分享一个提取字符串url地址函数,代码如下: 复制代码 代码如下: $postInfo['answer2'] ='可以的,商业贷款可摊还36%,公积金贷款可摊还16%|||可以先把账户里的余额提取出来用作首付,然后每个月贷款商业贷款可摊还36%,公积金贷款可摊还16%|||可以的,现在甲类公积金是摊还比例htt

  • Mysql中实现提取字符串中的数字的自定义函数分享

    因需要在mysql的数据表中某一字符串中的字段提取出数字,在网上找了一通,终于找到了一个可用的mysql函数,可以有效的从字符串中提取出数字. 该mysql提取出字符串中的数字函数如下: 复制代码 代码如下: CREATE FUNCTION GetNum (Varstring varchar(50)) RETURNS varchar(30) BEGIN DECLARE v_length INT DEFAULT 0; DECLARE v_Tmp varchar(50) default ''; se

  • JS正则表达式提取字符串中所有汉字的脚本

    在网上发现有人用vbscript正则表达式实现了这个功能,但代码很厂,偶改成js的了,很短的一段代码: var str="怎样从一个Html页面中提取所有汉字呢?不能有其它Html代码."; alert(str.replace(/[^\u4e00-\u9fa5]/gi,"")); [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 这里的关键是汉字escape后的编码范围是\u4e00-\u9fa5,知道这个问题就好解决了.

  • 提取字符串中年月日的函数代码

    var str="sfsfsfdf2011年sfsdfsf05月随碟附送lfs23日"; str.match(/\d{4}年[01]?\d月[0123]?\d日/g)[0]; match方法得到的是一个数组

  • python 正则表达式获取字符串中所有的日期和时间

    提取日期前的处理 1.处理文本数据的日期格式统一化 text = "2015年8月31日,衢州元立金属制品有限公司仓储公司(以下简称元立仓储公司)成品仓库发生一起物体打击事故,造成直接经济损失95万元." text1 = "2015/12/28下达行政处罚决定书" text2 = "2015年8月发生一起物体打击事故" # 对文本处理一下 # 2015-8-31 2015-12-28 text = text.replace("年&quo

随机推荐