PHP将部分内容替换成星号

在最近的项目中,会碰到到某人的手机号码隐藏中间几位,身份证号码只显示末尾4位的需求。当时一开始是网上搜索了一下,看到有人是用substr_replace这个函数来替换的,后面我也用了这个函数,但在用的时候不是很好用。
 
一、substr_replace
 
先来看看这个函数的语法:
 
substr_replace(string,replacement,start,length)
参数
描述
string
必需。规定要检查的字符串。
replacement
必需。规定要插入的字符串。
start

必需。规定在字符串的何处开始替换。
 
  正数 - 在第 start 个偏移量开始替换
 
  负数 - 在从字符串结尾的第 start 个偏移量开始替换
 
  0 - 在字符串中的第一个字符处开始替换
 
charlist

可选。规定要替换多少个字符。
 
  正数 - 被替换的字符串长度
 
  负数 - 从字符串末端开始的被替换字符数
 
  0 - 插入而非替换
 
1、当start与charlist都为正数的时候,非常好理解,也很符号人的逻辑,start是从0开始的,如下图,根据条件,绿色的将是要被替换的元素
 
 
 
2、当start为负数,charlist为正数的时候,也挺好理解的
 
 
 
3、当start为正数,charlist为负数的时候,这个我一开始理解错了
 
 
 
4、当start为负数,charlist为负数的时候,有一个地方需要注意的就是:如果 start 是负数且 length 小于等于 start,则 length 为 0。这个坑挺容易踩到的
 
 
 
5、charlist为0的时候,就变成插入了,而不是替换,额。。。
 
 
 
用下来,我是感觉不是很顺手,虽然说满足我现在的需求还是可以的,但是如果将来需要一些扩展的话,耍起来挺吃力的,所以就想到自己构造一个,将来用起来也方便。
 
 
 
二、自制的星号替换函数
 
replaceStar($str, $start, $length = 0)
参数
描述
str
必需。规定要检查的字符串。
start

必需。规定在字符串的何处开始替换。
 
  正数 - 在第 start 个偏移量开始替换
 
  负数 - 在从字符串结尾的第 start 个偏移量开始替换
 
  0 - 在字符串中的第一个字符处开始替换
 
length

可选。规定要替换多少个字符。
 
  正数 - 被替换的字符串长度,从左往右
 
  负数 - 被替换的字符串长度,从右往左
 
  0 - 如果start为正数,从start开始向左到最后
 
     - 如果start为负数,从start开始向右到最后
 
前面的两个参数与上面的一样,最后的参数与上面不同
 
1、当start与length都为正数,与substr_replace表现的一样
 
2、当start为负数,length为正数,与substr_replace表现的一样
 
 

substr_replace
replaceStar
start为正数,长度为负数

 
 
 
start为负数,长度为负数

 
 
 
 
 start为正数,长度为0
做插入操作

 start为负数,长度为0
做插入操作

三、源码分享
 
复制代码
public static function replaceStar($str, $start, $length = 0)
{
        $i = 0;
        $star = '';
        if($start >= 0) {
            if($length > 0) {
                $str_len = strlen($str);
                $count = $length;
                if($start >= $str_len) {//当开始的下标大于字符串长度的时候,就不做替换了
                    $count = 0;
                }
            }elseif($length < 0){
                $str_len = strlen($str);
                $count = abs($length);
                if($start >= $str_len) {//当开始的下标大于字符串长度的时候,由于是反向的,就从最后那个字符的下标开始
                    $start = $str_len - 1;
                }
                $offset = $start - $count + 1;//起点下标减去数量,计算偏移量
                $count = $offset >= 0 ? abs($length) : ($start + 1);//偏移量大于等于0说明没有超过最左边,小于0了说明超过了最左边,就用起点到最左边的长度
                $start = $offset >= 0 ? $offset : 0;//从最左边或左边的某个位置开始
            }else {
                $str_len = strlen($str);
                $count = $str_len - $start;//计算要替换的数量
            }
        }else {
            if($length > 0) {
                $offset = abs($start);
                $count = $offset >= $length ? $length : $offset;//大于等于长度的时候 没有超出最右边
            }elseif($length < 0){
                $str_len = strlen($str);
                $end = $str_len + $start;//计算偏移的结尾值
                $offset = abs($start + $length) - 1;//计算偏移量,由于都是负数就加起来
                $start = $str_len - $offset;//计算起点值
                $start = $start >= 0 ? $start : 0;
                $count = $end - $start + 1;
            }else {
                $str_len = strlen($str);
                $count = $str_len + $start + 1;//计算需要偏移的长度
                $start = 0;
            }
        }
 
        while ($i < $count) {
            $star .= '*';
            $i++;
        }
 
        return substr_replace($str, $star, $start, $count);
}
复制代码
不擅长算法,这里就用很普通的逻辑来展示啦,没有用到啥数学公式。
 
1、if($start >= 0)这里做start大于等于0与小于0的分支
 
2、在start 的分之中,分别再做length 大于0,小于0和等于0的三个分支
 
3、最后计算出start、count和要替换的星号字符串,最后计算出的start与count都是正数,运用substr_replace做替换
 
 
 
四、单元测试
 
复制代码
public function testReplaceStar()
    {
        $actual = App_Util_String::replaceStar('123456789', 3, 2);
        $this->assertEquals($actual, '123**6789');
        
        $actual = App_Util_String::replaceStar('123456789', 9);
        $this->assertEquals($actual, '123456789');
        
        $actual = App_Util_String::replaceStar('123456789', 9, 2);
        $this->assertEquals($actual, '123456789');
        
        $actual = App_Util_String::replaceStar('123456789', 9, -9);
        $this->assertEquals($actual, '*********');
        
        $actual = App_Util_String::replaceStar('123456789', 9, -10);
        $this->assertEquals($actual, '*********');
        
        $actual = App_Util_String::replaceStar('123456789', 9, -11);
        $this->assertEquals($actual, '*********');
        
        $actual = App_Util_String::replaceStar('123456789', 3);
        $this->assertEquals($actual, '123******');
        
        $actual = App_Util_String::replaceStar('123456789', 0);
        $this->assertEquals($actual, '*********');
        
        $actual = App_Util_String::replaceStar('123456789', 0, 2);
        $this->assertEquals($actual, '**3456789');
 
        $actual = App_Util_String::replaceStar('123456789', 3, -3);
        $this->assertEquals($actual, '1***56789');
        
        $actual = App_Util_String::replaceStar('123456789', 1, -5);
        $this->assertEquals($actual, '**3456789');
        
        $actual = App_Util_String::replaceStar('123456789', 3, -3);
        $this->assertEquals($actual, '1***56789');
        
        $actual = App_Util_String::replaceStar('123456789', -3, 2);
        $this->assertEquals($actual, '123456**9');
        
        $actual = App_Util_String::replaceStar('123456789', -3, 5);
        $this->assertEquals($actual, '123456***');
        
        $actual = App_Util_String::replaceStar('123456789', -1, 2);
        $this->assertEquals($actual, '12345678*');
        
        $actual = App_Util_String::replaceStar('123456789', -1, -2);
        $this->assertEquals($actual, '1234567**');
        
        $actual = App_Util_String::replaceStar('123456789', -4, -7);
        $this->assertEquals($actual, '******789');
        
        $actual = App_Util_String::replaceStar('123456789', -1, -3);
        $this->assertEquals($actual, '123456***');
        
        $actual = App_Util_String::replaceStar('123456789', -1);
        $this->assertEquals($actual, '*********');
        
        $actual = App_Util_String::replaceStar('123456789', -2);
        $this->assertEquals($actual, '********9');
        
        $actual = App_Util_String::replaceStar('123456789', -9);
        $this->assertEquals($actual, '*23456789');
        
        $actual = App_Util_String::replaceStar('123456789', -10);
        $this->assertEquals($actual, '123456789');
        
        $actual = App_Util_String::replaceStar('123456789', -10, -2);
        $this->assertEquals($actual, '123456789');
    }

时间: 2024-09-16 04:55:28

PHP将部分内容替换成星号的相关文章

轮廓-script 里面的内容替换成另一个script

问题描述 script 里面的内容替换成另一个script function drawRectangle(context,canvasHeight,canvasWidth){ context.fillStyle = "green";//填充样式演示 context.strokeStyle="red";//轮廓颜色 context.strokeRect(0,0,canvasWidth,canvasHeight);//绘制矩形轮廓 context.fillRect(0,

Python实现将绝对URL替换成相对URL的方法

  本文实例讲述了Python实现将绝对URL替换成相对URL的方法.分享给大家供大家参考.具体分析如下: 一.问题: 公司一个项目需要上传图片,一开始同事将图片上传后结合当前主机拼成了一个绝对的URL(http://192.168.1.1:888/m/getimg?filename=xxx.jpg)由于同时给手机终端提供接口,在手机终端会引起一些bug,改完代码后要求将以前的uri替换成相对的URL(/m/getimg?filename=xxx.jpg),由于图片是用img标签嵌入到内容同时用

word2013怎样将文字替换成图片

  word2013将文字替换成图片步骤①:我们打开Word2013,看到表格数据中有香蕉,下方有一个香蕉的图案,选中图案,Ctrl+X剪切下来. word2013将文字替换成图片步骤②:按下Ctrl+H打开查找与替换窗格,在查找里面输入香蕉,单击更多按钮. word2013将文字替换成图片步骤③:单击特殊格式选项,从弹出的菜单中选择"剪贴板"内容. word2013将文字替换成图片步骤④:此时可以看到替换栏里面输入了^c,我们单击全部替换,之后可以显示出替换了多少项. word201

将Word文档中雅黑引号全部替换成宋体引号

如果Word文档的默认字体是雅黑字体,输入中文的双引号时显示为与英文双引号一样的直引号,不能分出左右引号. 如果想让Word文档中的字体显示为雅黑,但引号显示为正常的中文左右引号,该怎么办呢? 下面我们介绍一个查找选定Word文档中所有引号并替换成宋体中文引号的小技巧. 图示:雅黑引号和宋体引号 按"Ctrl+F"组合键,在弹出的"查找和替换"窗口的"查找内容"中输入[""],点击"阅读突出显示"右边的小三

ecshop后台编辑器替换成ueditor编辑器

 这篇文章主要介绍了ecshop后台编辑器替换成ueditor编辑器的详细过程,这里推荐给有相同需求的小伙伴们.     1.Ueditor1.4.3下载(截止到2015-03-03最新版) 下载地址:http://ueditor.baidu.com/website/download.html 解决jquery冲突的jquery等相关文件下载 文件中已含js冲突修改文件,另外已修改php/config.json中的图处保存路径,用户也可以自行修改! 因为老杨用的是mac os系统,所以文件中有一

word教你如何把文字替换成图片

  word使用技巧:教你如何把文字替换成图片 1.首先把图片复制到 剪贴板中,然后打开替换对话框; 2.在"查找内容"框中输入将被替换的文字; 3.接着在"替换为"框中输入"^c"(注意:输入的一定要是半角字符,c要小写),单击替换即可. 说明:   "^c"的意思就是指令WordXP以剪贴板中的内容替换"查找内容"框中的内容.按此原理,"^c"还可替换包括回车符在内的任何可以复制到剪

Word2013如何将文字替换成图片

有些时候,用图片更加能让读者理解,通俗易懂,我们将Word中某些文字替换成图片,例如,香蕉替换为香蕉的图案,公司替换为公司LOGO都是不错的选择.下面,我就简单讲解一下如何进行替换. 方法介绍 ①我们打开Word2013,看到表格数据中有香蕉,下方有一个香蕉的图案,选中图案,Ctrl+X剪切下来. ②按下Ctrl+H打开查找与替换窗格,在查找里面输入香蕉,单击更多按钮. ③单击特殊格式选项,从弹出的菜单中选择"剪贴板"内容. ④此时可以看到替换栏里面输入了^c,我们单击全部替换,之后可

如何用python把一个txt文件中所有逗号——,替换成空格?

问题描述 如何用python把一个txt文件中所有逗号--,替换成空格? 如何用python把一个txt文件中所有逗号--,替换成空格? 就是a,b之间就是去掉逗号,但保持点距离 解决方案 读取open文件.然后read读取内容.用replace替换内容.write写回文件

C++实现将一个字符串中的字符替换成另一个字符串的方法_C 语言

本文实例讲述了C++实现将一个字符串中的字符替换成另一个字符串的方法,分享给大家供大家参考.具体方法如下: 题目要求: 原地实现字符串中的每个空格替换成"%20",例如输入"We are happy", 输出"We%20are%20happy" 被替换的字符串当然不仅仅是空格,上面只是个例子 这是道很好的题目,也是百度面试中的一道题,题目不难,但是问题得考虑全面.这里给出如下实现代码: #include <iostream> #inc