利用PHP将部分内容用星号替换_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');
 }

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php字符串替换
php替换文件内容
php 替换姓名星号、php 星号替换、php 用户名替换成星号、将身份证号替换为星号、excel星号替换,以便于您获取更多的相关知识。

时间: 2024-09-27 14:19:18

利用PHP将部分内容用星号替换_php实例的相关文章

提交表单后 PHP获取提交内容的实现方法_php实例

问题:网页上提交表单之后,PHP为什么不能获取提交的内容?然而在老版本的PHP上运行却正常. 新版的PHP已经废弃了原来的表单内容处理方式,即不再把提交的表单的内容直接复制到一个同名变量中. 解决办法有四个: 1. 修改php.ini,查找 register_globals,将其值修改为 On.这样就可以像原来一样,例如,提交的表单中包括一个名为"username"的变量,那么在php中就可以直接使用$username来访问该变量.但是,除非你要使用一段旧的代码而考虑到兼容性问题,否则

PHP 读取文本文件内容并分页显示_php实例

功能很简单,只是使用 PHP 读取文本(TXT)文件 并分页显示 <?php //----------------you should save this file as m.php---------------- session_start(); if (empty($page)) {$page=1;} if (isset($_GET['page'])==TRUE) {$page=$_GET['page']; } ?> <html> <head> <meta h

页面利用渐进式JPEG来提升用户体验度_php实例

今天才认识到原来JPEG文件有两种保存方式他们分别是Baseline JPEG(标准型)和Progressive JPEG(渐进式).两种格式有相同尺寸以及图像数据,他们的扩展名也是相同的,唯一的区别是二者显示的方式不同. Baseline JPEG 这种类型的JPEG文件存储方式是按从上到下的扫描方式,把每一行顺序的保存在JPEG文件中.打开这个文件显示它的内容时,数据将按照存储时的顺序从上到下一行一行的被显示出来,直到所有的数据都被读完,就完成了整张图片的显示.如果文件较大或者网络下载速度较

利用PHP如何写APP接口详解_php实例

搭建PHP环境 由于本人使用的电脑是Mac,因此推荐大家使用MAMP PRO这款软件,不过是收费版,相信不想花钱的大家会有办法搞定的! MAMP PRO这款软件是集成环境软件,已经有apache.mysql.php了,具备运行解析PHP的环境了! 如果不想使用集成环境,可以自己搭建.Mac自带了apache和PHP环境的,只需要稍加配置一下就可以使用了,然后再安装一下mysql就可以了! 大家可以看一下简单版本配置:Mac配置PHP环境 这篇文章. 启动服务器 这里是以MAMP PRO软件为例,

php获取文件内容最后一行示例_php实例

复制代码 代码如下: $rs = 'README.md';$fp = fopen($rs, 'r'); fseek($fp,-1,SEEK_END); $s = '';while(($c = fgetc($fp)) !== false) {  if($c == "\n" && $s) break;  $s = $c . $s;  fseek($fp, -2, SEEK_CUR);}fclose($fp);echo $s;exit;

php获取网页中图片、DIV内容的简单方法_php实例

1.获取网页中所有的图片: 复制代码 代码如下: <?php   //取得指定位址的內容,并储存至 $text  $text=file_get_contents('http://www.jb51.net/');      //取得所有img标签,并储存至二维数组 $match 中   preg_match_all('/<img[^>]*>/i', $text, $match);     //打印出match   print_r($match);   ?> 2.获取网页中的第一

replace-请教手机号中间四位数用星号替换?

问题描述 请教手机号中间四位数用星号替换? 在jsp列表页面,点击其中一条数据进行编辑,进入编辑页面手机号中间四位显示的是星号,但是点击提交按钮时也把星号带到了数据库,,要做的就是,星号只展示,提交时还是完整号码.列表中的手机号不做显示,只有点击编辑才能显示手机号 解决方案 如果仅仅是做展示用(不修改手机号码)的话,修改信息提交时排除掉手机这个字段就行了. 如果是要修改手机号码,那至少要从input标签里get value的,你又想让用户修改手机的时候看到的是星号,提交的时候又原样号码提交,那你

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

前言 我研究了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

帝国cms内容关键字自动加链接且设置内容关键字只替换一次

网站上线前先设置一些内部链接对后期的优化排名很有帮助,帝国cms也可以设置文章中的关键字自动加链接,但是要注意一下关键词替换次数,最好是1次. 怎么操作呢?分两步完成 1.帝国cms文章关键字自动加链接:后台 - 其他 - 管理内容关键字 - 在框中添加关键词和链接 2.设置关键词只显示一次(关键词链接只替换一次) 后台 - 系统 - 系统 - 系统设置 - 系统参数设置 - 信息设置 找到"信息内容关键字重复替换",把默认的"0"改成"1" 帝