PHP通過Regex提取字串中的手機號並判斷電訊廠商,簡單快速方便,能提取多個手機號。下面通過本文執行個體代碼給大家詳細介紹,需要的的朋友參考下吧
0. 簡介
PHP通過Regex提取字串中的手機號並判斷電訊廠商,簡單快速方便,能提取多個手機號。
1. 代碼
<?phpheader("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';//匹配數位Regex 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';//匹配數位Regex 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';//匹配數位Regex 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 可能是沒有區號的固定電話