PHP中将一个字符串部分字符用星号*替代隐藏的实现代码


Posted in PHP onSeptember 08, 2019

有时候我们在开发中会遇到这样一种情况,例如:显示手机号我们需要将中间4位遮挡掉,一般使用“*”号代替,或是显示身份证号码是为了保护个人信息也同样需要遮挡掉4位,故可用到下列方式、代码进行实现:

核心代码

<?php 
 
/**
 +----------------------------------------------------------
 * 将一个字符串部分字符用*替代隐藏
 +----------------------------------------------------------
 * @param string $string 待转换的字符串
 * @param int  $bengin 起始位置,从0开始计数,当$type=4时,表示左侧保留长度
 * @param int  $len  需要转换成*的字符个数,当$type=4时,表示右侧保留长度
 * @param int  $type  转换类型:0,从左向右隐藏;1,从右向左隐藏;2,从指定字符位置分割前由右向左隐藏;3,从指定字符位置分割后由左向右隐藏;4,保留首末指定字符串
 * @param string $glue  分割符
 +----------------------------------------------------------
 * @return string 处理后的字符串
 +----------------------------------------------------------
 */
function hideStr($string, $bengin = 0, $len = 4, $type = 0, $glue = "@") {
	if (empty($string))
		return false;
	$array = array();
	if ($type == 0 || $type == 1 || $type == 4) {
		$strlen = $length = mb_strlen($string);
		while ($strlen) {
			$array[] = mb_substr($string, 0, 1, "utf8");
			$string = mb_substr($string, 1, $strlen, "utf8");
			$strlen = mb_strlen($string);
		}
	}
	if ($type == 0) {
		for ($i = $bengin; $i < ($bengin + $len); $i++) {
			if (isset($array[$i]))
				$array[$i] = "*";
		}
		$string = implode("", $array);
	} else if ($type == 1) {
		$array = array_reverse($array);
		for ($i = $bengin; $i < ($bengin + $len); $i++) {
			if (isset($array[$i]))
				$array[$i] = "*";
		}
		$string = implode("", array_reverse($array));
	} else if ($type == 2) {
		$array = explode($glue, $string);
		$array[0] = hideStr($array[0], $bengin, $len, 1);
		$string = implode($glue, $array);
	} else if ($type == 3) {
		$array = explode($glue, $string);
		$array[1] = hideStr($array[1], $bengin, $len, 0);
		$string = implode($glue, $array);
	} else if ($type == 4) {
		$left = $bengin;
		$right = $len;
		$tem = array();
		for ($i = 0; $i < ($length - $right); $i++) {
			if (isset($array[$i]))
				$tem[] = $i >= $left ? "*" : $array[$i];
		}
		$array = array_chunk(array_reverse($array), $right);
		$array = array_reverse($array[0]);
		for ($i = 0; $i < $right; $i++) {
			$tem[] = $array[$i];
		}
		$string = implode("", $tem);
	}
	return $string;
}
 
 
$str = '12345678901';
echo hideStr($str,2,4);

有时候需要考虑中文的替换那么可以参考下面的实现方法

对于字符串某部分使用*号替换的问题:

1.实例:

$username = "linshouyue"; 
echo substr_replace($username,'****','3','4'); 

substr_replace()函数  

1.1)第一参数为需处理的字符串
1.2)第二参数为使用的替换符号
1.3)第三/四参数为需要替换的字符串位置(从第三个字符开始替换后四位字符)

但是该函数对于英文字符/数字数没有任何问题得,但是一旦遇到汉字就会出现很尴尬的问题,因为汉字与英文字符的字节是不一样的,可以使用一下方法解决:

/**     * *替换中文汉字

     * @author 月月

     */
    function substr_cut($user_name){
        $strlen     = mb_strlen($user_name, 'utf-8');
        $firstStr     = mb_substr($user_name, 0, 1, 'utf-8');
        $lastStr     = mb_substr($user_name, -1, 1, 'utf-8');
        return $strlen == 2 ? $firstStr . str_repeat('*', mb_strlen($user_name, 'utf-8') - 1) : $firstStr . str_repeat("*", $strlen - 2) . $lastStr;
    }

好了,这篇文章就介绍到这了

PHP 相关文章推荐
php 常用类汇总 推荐收藏
May 13 PHP
深入了解PHP类Class的概念
Jun 14 PHP
PHP实现的多彩标签效果代码分享
Aug 21 PHP
PHP判断手机是IOS还是Android
Dec 09 PHP
详解js异步文件加载器
Jan 24 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
Zend Framework动作助手Json用法实例分析
Mar 05 PHP
Yii2中如何使用modal弹窗(基本使用)
May 30 PHP
PHP链表操作简单示例
Oct 15 PHP
数组任意位置插入元素,删除特定元素的实例
Mar 02 PHP
微信公众号实现会员卡领取功能
Jun 08 PHP
PHP中16个高危函数整理
Sep 19 PHP
Yii框架连表查询操作示例
Sep 06 #PHP
Laravel框架中缓存的使用方法分析
Sep 06 #PHP
Laravel框架实现的上传图片到七牛功能详解
Sep 06 #PHP
浅析PHP7 的垃圾回收机制
Sep 06 #PHP
PHP的介绍以及优势详细分析
Sep 05 #PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
Sep 05 #PHP
Laravel5.4框架中视图共享数据的方法详解
Sep 05 #PHP
You might like
PHP 加密与解密的斗争
2009/04/17 PHP
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
php 归并排序 数组交集
2011/05/10 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
Vue.js每天必学之方法与事件处理器
2016/09/06 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
详解如何使用webpack+es6开发angular1.x
2017/08/16 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
3分钟学会一个Python小技巧
2018/11/23 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
一些关于MySql加速和优化的面试题
2014/01/30 面试题
考试不及格检讨书
2014/01/09 职场文书
学生感冒英文请假条
2014/02/04 职场文书
推广活动策划方案
2014/08/23 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
党员个人年度总结
2015/02/14 职场文书
学术会议开幕词
2016/03/03 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android