目录
PHP将部分内容替换成星号
首页 后端开发 php教程 PHP将部分内容替换成星号_PHP教程

PHP将部分内容替换成星号_PHP教程

Jul 13, 2016 am 10:19 AM
内容 部分

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
                $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
                $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
            $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');
    }

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/871181.htmlTechArticlePHP将部分内容替换成星号 在最近的项目中,会碰到到某人的手机号码隐藏中间几位,身份证号码只显示末尾4位的需求。当时一开始是网上...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在iPhone上启用'敏感内容警告”并了解其功能 如何在iPhone上启用'敏感内容警告”并了解其功能 Sep 22, 2023 pm 12:41 PM

特别是在过去十年中,移动设备已成为与朋友和家人分享内容的主要方式。易于访问、易于使用的界面以及实时捕获图像和视频的能力使其成为制作和共享内容的绝佳选择。但是,恶意用户很容易滥用这些工具来转发不需要的敏感内容,这些内容可能不适合查看并未经您的同意。为了防止此类情况发生,iOS17中引入了带有“敏感内容警告”的新功能。让我们来看看它以及如何在iPhone上使用它。新的“敏感内容警告”是什么,它是如何工作的?如上所述,敏感内容警告是一项新的隐私和安全功能,旨在帮助防止用户查看敏感内容,包括iPhone

Microsoft Edge浏览器打开是360导航怎么改-更改打开是360导航的方法 Microsoft Edge浏览器打开是360导航怎么改-更改打开是360导航的方法 Mar 04, 2024 pm 01:50 PM

怎么更改MicrosoftEdge浏览器打开是360导航的页面呢?其实很简单,那么现在小编就和大家一起分享关于更改MicrosoftEdge浏览器打开是360导航页面的方法,有需要的朋友可以来看看哦,希望可以帮助到大家。打开MicrosoftEdge浏览器。我们看到是下图这种页面。点击右上角的三点图标。点击“设置”。在设置页面的左侧栏里点击“启动时”。点击右侧栏里的图中示意的三点(不要能点击“打开新标签页”),然后点击编辑,将网址改成“0”(或其他无意义的数字)。然后点击“保存”。接下来,选择“

Cheat Engine如何设置中文?Cheat Engine设置中文方法 Cheat Engine如何设置中文?Cheat Engine设置中文方法 Mar 13, 2024 pm 04:49 PM

  CheatEngine是一款游戏编辑器,能够对游戏的内存进行编辑修改。但是它的默认语言是非中文的,对于很多小伙伴来说比较不方便,那么CheatEngine怎么设置中文呢?今天小编就给大家详细介绍一下CheatEngine设置中文的方法,希望可以帮助到你。  设置方法一  1、双击打开软件,点击左上角的“edit”。  2、接着点击下方选项列表中的“settings”。  3、在打开的窗口界面中,点击左侧栏中的“languages”

Microsoft Edge在哪设置显示下载按钮-Microsoft Edge设置显示下载按钮的方法 Microsoft Edge在哪设置显示下载按钮-Microsoft Edge设置显示下载按钮的方法 Mar 06, 2024 am 11:49 AM

大家知道MicrosoftEdge在哪设置显示下载按钮吗?下文小编就带来了MicrosoftEdge设置显示下载按钮的方法,希望对大家能够有所帮助,一起跟着小编来学习一下吧!第一步:首先打开MicrosoftEdge浏览器,单击右上角【...】标识,如下图所示。第二步:然后在弹出菜单中,单击【设置】,如下图所示。第三步:接着单击界面左侧【外观】,如下图所示。第四步:最后单击【显示下载按钮】右侧按钮,由灰变蓝即可,如下图所示。上面就是小编为大家带来的MicrosoftEdge在哪设置显示下载按钮的

我们如何在HTML中将三个部分并排放置? 我们如何在HTML中将三个部分并排放置? Sep 04, 2023 pm 11:21 PM

标签定义HTML文档的划分。该标签主要用于将相似的内容分组在一起以方便样式设置,也用作HTML元素的容器。我们使用CSS属性在HTML中并排放置三个分区标记。CSS属性float用于实现此目的。语法下面是<div>标签的语法。<divclass='division'>Content…</div>Example1的中文翻译为:示例1以下是使用CSS属性在HTML中将三个分区类并排放置的示例。<!DOCTYPEhtml><html><

时空中的绘旅人艾因的日常:常驻内容更新 时空中的绘旅人艾因的日常:常驻内容更新 Mar 01, 2024 pm 08:37 PM

时空中的绘旅人已经确定在2月29日更新之后,玩家可以和艾因一起去参加露天音乐节,获得与艾因的好感度加成,3月4日将会开启缱绻假日煦色韶光活动,玩家可以提升假日行程等级解锁全新短信和Lofter内容。时空中的绘旅人艾因的日常:常驻内容更新更新2月29日版本后,可体验全新校园日程[参加露天音乐节],跟艾因一起参与可获得好感度加成。3月4日09:30-4月15日05:00,在「缱绻假日·煦色韶光」活动期间提升[假日行程]等级到8级和28级,可分别解锁全新短信和Lofter内容。*新增短信、Lofter

解析 Solana 的 DEX 布局:Jupiter 是不是生态的未来? 解析 Solana 的 DEX 布局:Jupiter 是不是生态的未来? Mar 26, 2024 pm 02:10 PM

来源:深潮TechFlow作为Solana生态中备受瞩目的新兴项目,Jupiter尽管推出时间不长,却已经在DeFi领域中迅速崭露头角。然而,即使在这样快速发展的环境中,经济模型的完善和代币价格的稳定仍然至关重要。缺乏这些支撑,项目很容易陷入恶性循环,最终可能导致其衰落甚至无法为自身维持生机。因此,Jupiter需要不断优化其经济设计,确保代币价格稳定性,以确保项目的长期发展和成功。Solana链在最近一周表现强劲,其代币SOL在二级市场上涨势如虹,而Jupiter的代币$JUP也在过去两周内涨

思维导图在线有哪些内容 思维导图在线有哪些内容 Mar 20, 2024 am 10:43 AM

思维导图这款软件,打个比方就好像是应用于记忆、学习、思考等的思维“地图”,它的出现有利于人脑的扩散思维的展开。不难发现,现如今很多企业都会利用思维导图来拓展员工的思维等等。那么你知道思维导图在线都有哪些内容吗?今天,小编就来简单的介绍一下。1.本课课程目录具体如图所示。2.Xmind的主题操作属性有主题属性、展开主题、全选主题、主题调序。3.主题的属性有插入、删除、撤销、复制、粘贴具体如图示。4.打开【Xmind8】软件,点击【新建】,按【Insert】插入下一级,再次选择【分支】,按【Inse

See all articles