本文主要和大家分享php提取字符串中的手机号实现代码,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正则表达式实现手机号码中间4位用星号替换显示功能
以上就是php提取字符串中的手机号实现代码的详细内容。