利用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)

前面的两个参数与上面的一样,最后的参数与上面不同

1、当start与length都为正数,与substr_replace表现的一样

2、当start为负数,length为正数,与substr_replace表现的一样

三、源码分享

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

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)

    Easter Eggs(复活节彩蛋)外行人估计不了解这是神木玩意,彩蛋的网络解释是:用于电脑.电子游戏.电脑游戏.影碟或其他互动多媒体之中的隐藏功能或信息.PHP包含一个安全漏洞,可能导致未经授权的信息披露,如果你正在运行PHP,就有可能会被人发现PHP版本和其他敏感信息.我觉得有必要解决这个彩蛋问题来确保你网站的安全性. PHP彩蛋是如何运作的 只要运行PHP的服务器上,访问任何网页都可以在域名后添加以下字符串来查看信息: 复制代码 代码如下: ?=PHPB8B5F2A0-3C92-11d3-

  • PHP用星号隐藏部份用户名、身份证、IP、手机号等实例

    一.仿淘宝评论购买记录隐藏部分用户名,以下代码亲测可用. 复制代码 代码如下: function cut_str($string, $sublen, $start = 0, $code = 'UTF-8') {     if($code == 'UTF-8')     {         $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\

  • php隐藏实际地址的文件下载方法

    本文实例讲述了php隐藏实际地址的文件下载方法.分享给大家供大家参考.具体如下: 下面这段php代码可不透露实际的文件下载地址. function download_document($filename,$path="",$mimetype="application/octet-stream") { header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); heade

  • PHP中用header图片地址 简单隐藏图片源地址

    复制代码 代码如下: <?php        $path=$_GET["path"];        $cacheimgname=str_replace("/","_",$path);        $localimg="upimg/".$cacheimgname;        if ((file_exists($localimg)))        {        $httpurl=$localimg;     

  • php隐藏IP地址后两位显示为星号的方法

    本文实例讲述了php隐藏IP地址后两位显示为星号的方法.分享给大家供大家参考.具体实现方法如下: 我们在很多的公共网站中都会有碰到显示用户的IP时后面几个IP段显示为星号了,这样很好的保护了用户隐私了,感兴趣的朋友可以一起来看看. php正则格式化IP地址,隐藏后一位. 例子 复制代码 代码如下: <?php //隐藏后一位 return preg_replace('/(\d+)\.(\d+)\.(\d+)\.(\d+)/is',"$1.$2.$3.*",$ip);   //隐藏

  • PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享

    php屏蔽电话号码中间四位: 复制代码 代码如下: Method 1: 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}[\-]

  • Yii隐藏URL中index.php的方法

    本文实例讲述了Yii隐藏URL中index.php的方法.分享给大家供大家参考,具体如下: 一.修改config/下的main.php里的: 'urlManager'=>array( 'urlFormat'=>'path', 'showScriptName'=>false, 'rules'=>array( '<controller:\w+>/<id:\d+>'=>'<controller>/view', '<controller:\w

  • PHP使用星号隐藏用户名,手机和邮箱的实现方法

    本文实例讲述了PHP使用星号隐藏用户名,手机和邮箱的实现方法.分享给大家供大家参考,具体如下: PHP使用星号替代用户名手机和邮箱这个在许多的活动界面会看到如淘宝的购物界面中的一些客户的支付宝号都是隐藏掉的哦,下面我们来看一下它的使用方法吧. <?php function hideStar($str) { //用户名.邮箱.手机账号中间字符串以*隐藏 if (strpos($str, '@')) { $email_array = explode("@", $str); $prev

  • 如何隐藏你的.php文件

    今天做PHP在线手册镜像的时候看到了这个方法,哈哈,以前都没有注意到,所以说,手册是最好的老师 ------------------------------------------------------------------------------------- 如果不想让别人知道你的网站使用PHP程序以达到安全的目的.你可以按照下面的方法配置你的httpd.conf文件 但这并不说明PHP不安全. 你可以使用下面的方法来达到隐藏的目的: 1.将PHP隐藏为其它语言 在你的httpd.con

  • 利用PHP将部分内容用星号替换

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

  • Python如何利用Har文件进行遍历指定字典替换提交的数据详解

    利用Chrome或Firefox保存的Har文件http/https请求,可用于遍历字典提交From表单. 少说废话直接上代码 Github地址:https://github.com/H0xMrLin/wuppwn #encoding:utf-8 import sys; #Yeah,我没有注释.懒得写 HelpContent=""" Help: +=================================================================

  • 利用OpenCV实现绿幕视频背景替换

    目录 前言 一.图像预处理 二.HSV色彩空间转换 1. cvtColor色彩空间转换 2. inRange抠图 三.背景替换 四.源码 总结 前言 本文将使用OpenCV C++ 进行绿幕视频背景替换. 一.图像预处理 背景 绿幕视频 首先,我们需要使用resize API将背景图尺寸修改与视频尺寸大小.这样才能进行后续的像素赋值操作. Mat bg = imread("background.jpg"); //背景图 VideoCapture capture; //读取待处理的绿幕视

  • 利用Go语言追加内容到文件末尾

    前言 我研究了file库,终于让我找到了利用Go语言追加内容到文件末尾的办法 主要的2个函数: func (f *File) Seek(offset int64, whence int) (ret int64, err error) func (f *File) WriteAt(b []byte, off int64) (n int, err error) Seek()查到文件末尾的偏移量 WriteAt()则从偏移量开始写入 以下是例子: // fileName:文件名字(带全路径) // c

  • IntelliJ IDEA全局内容搜索和替换教程图解

    在做项目时,有时会在整个项目里或指定文件夹下进行全局搜索和替换,这是一个很方便功能.使用方法如下: 一.全局搜索 1.使用快捷键Ctrl+Shift+F打开搜索窗口,或者通过点击Edit–>Find–>Find in path打开搜索窗口,如下图: 2.搜索界面如下,主要分为上中下三部分,上部主要为搜索条件(要搜索的内容.范围.方式等),中间部分为包含搜索内容的文件列表,点击单个文件可以在下面部分预览文件内容. 3.搜索范围包括整个项目In project.模块module.指定目录direc

  • python 对txt中每行内容进行批量替换的方法

    如下所示: f = open('./val.txt') lines = f.readlines() #整行读取 f.close() for line in lines: rs = line.rstrip('\n') #去除原来每行后面的换行符,但有可能是\r或\r\n newname=rs.replace(rs,'/JPEGImages/'+rs+'.jpg'+' '+'/SegmentationClassAug/'+rs+'.png') newfile=open('.val1.txt','a'

  • JavaScript 替换所有匹配内容及正则替换方法

    由于JavaScript 的 replace 只能替换一次,因此另外编写一个能现替换全部匹配内容方法,代码如下: /* 把 content 中所有的 searchValue 替换为 replaceValue */ function replaceAll(content,searchValue,replaceValue){ while (content.indexOf(searchValue)>-1) { content = content.replace(searchValue,replaceV

  • mysql 替换字段部分内容及mysql 替换函数replace()

    [mysql]replace的用法(替换某字段部分内容) [mysql]replace的用法 1.replace into replace into table (id,name) values('1','aa'),('2','bb')           此语句的作用是向表table中插入两条记录.如果主键id为1或2不存在就相当于           insert into table (id,name) values('1','aa'),('2','bb')           如果存在相

  • 微信小程序利用for循环解决内容变更问题

    问题描述 学习小程序的小伙伴可能会有这样的问题:微信小程序的页面内容要发生改变,在小程序中如何快速的来创造一个格式相同,但仅仅改变内容且易于改变的页面呢?接下来就来解决这个问题吧. 解决方案 整体思路是创建一个数组,将页面内容写进数组,利用for循环来达到遍历数组的目的,从而实现利用数组的变量来改变页面的内容. 第一步:首先在 js页面在 data 中创建一个数组名为 sums ,并在数组当中添加内容. 代码示例: data: { sums:[{ imgone:"/pages/img/ 一人之下

  • nodejs利用readline提示输入内容实例代码

    目录 前言 1. bat执行js 2. 终端提示输入版本号.执行打包命令 3. 修改版本号文件 总结 前言 最近进行小版本发包测试时忘记修改版本号了,进而想到在打包前提示输入版本号,然后把版本号打进版本说明内.最终效果为双击bat文件在终端内提示输入版本号,输入完成后保存版本号. 虽说批处理也可以做这事,但用js来写更得心应手点,故选用js处理. 过程分为四步 bat执行js 终端提示输入版本号.执行打包命令 修改版本号文件 gulp读取版本号json文件 简单来说是用bat文件触发打包命令进行

随机推荐