方法片段:PHP正则识别字符串中的中国手机号
简介
本方法片段只支持识别中国国内手机号,暂不支持识别国际手机号
各国手机号识别可参考 libphonenumber
javascript 版本libphonenumber-js
片段
/**
* identifyMobilesInString
* 识别字符串中的中国手机号
*
* @param string $oldStr
* @return array
*/
function identifyMobilesInString($oldStr = "")
{
// 检测字符串是否为空
$oldStr = trim($oldStr);
$numbers = array();
if (empty($oldStr)) {
return $numbers;
}
// 删除nationcode-mobile,area code-之类的号码中间的减号(-)
$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
$cmcc = "/^((((13[4-9])|(14[78])|(15[012789])|(165)|(17[28])|(18[23478])|(198))\d{8})|(170[356]\d{7
}))$/";
// * 中国联通:China Unicom
$unicom = "/^((((13[0-2])|(14[56])|(15[56])|(16[67])|(17[156])|(18[56]))\d{8})|((170[4789])\d{7}))$/";
// * 中国电信:China Telecom
$telecom = "/^((((133)|(149)|(153)|(17[37])|(18[019])|(19[19]))\d{8})|(170[0-2]\d{7}))$/";
//
foreach ($result[1] as $key => $value) {
if (preg_match($cmcc, $value)) {
$nums[] = array("number" => $value, "type" => "中国移动");
} elseif (preg_match($unicom, $value)) {
$nums[] = array("number" => $value, "type" => "中国联通");
} elseif (preg_match($telecom, $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;
}
本文链接:https://www.masterzc.cn/archives/103.html
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处