php提取字符串中的手机号码或固话
2022-04-09 05:50 作者:爱聚二郎 围观:105 次php提取字符串中的手机号码或固话
一、php提取字符串中的手机号码或固话
/*通用方法*/
function findNum($str='')
{
$str=trim($str);
if(empty($str))
{
return '';
}
$reg= "/[^0-9+]*(?P(\+86[0-9]{11})|([0-9]{11})|([0-9]{3,4}-[0-9]{7,10}))[^0-9+]*/";
preg_match_all($reg,$str,$result); if(is_array($result)&&!empty($result)&&!empty($result[1])&&!empty($result[1][0]))
{
return $result[1][0];
}
return '';
}
二、另外附上PHP提取字符串中的数字的方法我觉得两个方法应该都是常用所以放在一起推荐
使用in_array方法:
function findNum($str=''){
$str=trim($str);
if(empty($str)){return '';}
$temp=array('1','2','3','4','5','6','7','8','9','0');
$result='';
for($i=0;$i
if(in_array($str[$i],$temp)){
$result.=$str[$i];
}
}
return $result;
}
使用is_numeric函数:
function findNum($str=''){
$str=trim($str);
if(empty($str)){return '';}
$result='';
for($i=0;$i
if(is_numeric($str[$i])){
$result.=$str[$i];
}
}
return $result;
}
三、也是跟提取字符串有关系的方法 就是把字符串中的号码进行替换可以是完全的替换可拨打的链接也可以替换为*号
function hidtel($phone)
{
$IsWhat = preg_match('/(0[0-9]{2,3}[\-]?[2-9][0-9]{6,7}[\-]?[0-9]?)/i',$phone); //固定电话
if($IsWhat == 1)
{
return preg_replace('/(0[0-9]{2,3}[\-]?[2-9])[0-9]{3,4}([0-9]{3}[\-]?[0-9]?)/i','$1****$2',$phone);
}else
{
return preg_replace('/(1[358]{1}[0-9])[0-9]{4}([0-9]{4})/i','$1****$2',$phone);
}
}
提示:想换成可点击的拨打电话链接可以这样,对比下着两端代码 其实区别就在于$0-$1-$2 而已,$0是获取匹配到的完整号码,$1是获取前三位,$2是获取后4位
function hidtel($phone)
{
$IsWhat = preg_match('/(0[0-9]{2,3}[\-]?[2-9][0-9]{6,7}[\-]?[0-9]?)/i',$phone); //固定电话
if($IsWhat == 1)
{
return preg_replace('/(0[0-9]{2,3}[\-]?[2-9])[0-9]{3,4}([0-9]{3}[\-]?[0-9]?)/i','$0',$phone);
}else
{
return preg_replace('/(1[358]{1}[0-9])[0-9]{4}([0-9]{4})/i','$0',$phone);
}
}
PHP获取字符中的手机号
场景:客服在线聊天过程中,经常需要获取客户的手机号作为唯一标记,比如在微信小程序聊天过程中,客服需要得到客户的手机号,从而获取客户整体画像(比如从淘宝或者京东买了什么);现在的操作流程是,客服复制出来,或者手动添加到后台系统里面,非常麻烦;因此希望能自动从聊天记录里面分析出手机号,然后记录到客户信息里面;
目标:从字符串中获取手机号
思路:遍历字符串,获取符合规则要求的手机号码,然后将手机号码存储到后台;
实现:
/** * 从字符串中获取手机号码(匹配第一个) * @param string $need_check_string 待处理的字符串 * @return string 手机号 */public function find_phone_from_string(string $need_check_string): string{ //检查是不是为空 if (empty($need_check_string)) { return ''; } //去掉前后空格 $need_check_string = trim($need_check_string); $check_string = ''; //获取字符的总长度 $check_string_len = mb_strlen($need_check_string); //遍历每个字符 for ($check_string_index = 0; $check_string_index < $check_string_len; $check_string_index++) { $current_char = mb_substr($need_check_string, $check_string_index, 1); //不是数字,检查是不是手机 if (!is_numeric($current_char)) { //是手机,返回手机,不再继续检查了 if (!empty($check_string) && $this->is_phone_string($check_string)) { return $check_string; } //不是手机,需要把当前待检查字符清空 $check_string = ''; //这里不再继续往下循环 continue; } //如果是数字,拼接到$check_string中 $check_string .= $current_char; //去掉086或者86的前缀 if ($check_string == '86' || $check_string == '086') { $check_string = ''; //这里不再继续往下循环 continue; } //是手机,返回手机,不再继续检查了 if ($this->is_phone_string($check_string)) { //如果手机号后面还是数字,不合法 if ($check_string_index + 1 < $check_string_len && is_numeric(mb_substr($need_check_string, $check_string_index + 1, 1))) { $check_string = ''; //这里不再继续往下循环 continue; } return $check_string; } } return '';}/** * 检查一个字符串是不是手机号 * @param string $need_check_string 待处理的手机号 * @return bool 是否是手机号 */public function is_phone_string(string $need_check_string): bool{ if (empty($need_check_string)) { return false; } //去掉空格,检查是否是 11位数字(手机都是11位数字) $need_check_string = trim($need_check_string); if (!is_numeric($need_check_string) || strlen($need_check_string) != 11) { return false; } return preg_match("/^1[23456789]\d{9}$/", $need_check_string);}
测试:
function test(){ header("Content-type:text/html;charset=utf-8"); echo auto_reply_service::get_instance()->find_phone_from_string('我是二郎15088725396'); echo "<br/>"; echo auto_reply_service::get_instance()->find_phone_from_string('15088725396'); echo "<br/>"; echo auto_reply_service::get_instance()->find_phone_from_string('我是86-15088725396二郎'); echo "<br/>"; echo auto_reply_service::get_instance()->find_phone_from_string('我是08615088725396二郎'); echo "<br/>"; echo auto_reply_service::get_instance()->find_phone_from_string('我是086150887253961二郎'); echo "<br/>";}
输出:
1:150887253962:150887253963:150887253964:150887253965: