PHP怎么实现局部替换

PHP实现局部替换的方法:1、通过“substr_replace”函数实现局部替换;2、通过自制的星号替换函数“replaceStar($str, $start, $length=0)”实现局部替换。

PHP怎么实现局部替换

本文操作环境:windows7系统、PHP7.1版,DELL G3电脑

PHP实现局部替换、利用PHP将部分内容用星号替换

在最近的项目中,会碰到到某人的手机号码隐藏中间几位,身份证号码只显示末尾4位的需求。当时一开始是网上搜索了一下,看到有人是用substr_replace这个函数来替换的,后面我也用了这个函数,但在用的时候不是很好用。

一、substr_replace

立即学习“PHP免费学习笔记(深入)”;

先来看看这个函数的语法:

 代码如下:

substr_replace(string,replacement,start,length)

登录后复制参数描述string必需。规定要检查的字符串。replacement必需。规定要插入的字符串。start

必需。规定在字符串的何处开始替换。

 正数 – 在第 start 个偏移量开始替换

 负数 – 在从字符串结尾的第 start 个偏移量开始替换

 0 – 在字符串中的第一个字符处开始替换

charlist

可选。规定要替换多少个字符。

  正数 – 被替换的字符串长度

  负数 – 从字符串末端开始的被替换字符数

  0 – 插入而非替换

当start与charlist都为正数的时候,非常好理解,也很符号人的逻辑,start是从0开始的,如下图,根据条件,绿色的将是要被替换的元素

PHP怎么实现局部替换

当start为负数,charlist为正数的时候,也挺好理解的

PHP怎么实现局部替换

当start为正数,charlist为负数的时候,这个我一开始理解错了

PHP怎么实现局部替换

当start为负数,charlist为负数的时候,有一个地方需要注意的就是:如果 start 是负数且 length 小于等于 start,则 length 为 0。这个坑挺容易踩到的

PHP怎么实现局部替换

charlist为0的时候,就变成插入了,而不是替换,额。。。

用下来,我是感觉不是很顺手,虽然说满足我现在的需求还是可以的,但是如果将来需要一些扩展的话,耍起来挺吃力的,所以就想到自己构造一个,将来用起来也方便。

推荐学习:《PHP视频教程》

二、自制的星号替换函数

代码如下:

replaceStar($str, $start, $length = 0)

登录后复制

PHP怎么实现局部替换

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

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

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

PHP怎么实现局部替换

源码分享

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) {//当开始的下标大于字符串长度的时候,由于是反向的,就从最后那个字符的下标开始   $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 ? $start : 0;  $count = $end - $start + 1;  }else {  $str_len = strlen($str);  $count = $str_len + $start + 1;//计算需要偏移的长度  $start = 0;  } } while ($i 

不擅长算法,这里就用很普通的逻辑来展示啦,没有用到啥数学公式。

登录后复制

if($start >= 0)这里做start大于等于0与小于0的分支

在start 的分之中,分别再做length 大于0,小于0和等于0的三个分支

最后计算出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怎么实现局部替换的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2516293.html

(0)
上一篇 2025年3月5日 15:51:34
下一篇 2025年2月26日 23:59:55

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • php中产生随机数的两种方式

    在php中为了之制造一些偶然性,我们可能需要将一些变量的值设置为随机的,为了解决这一问题,php中内置了函数rand()、mt_rand()函数来解决这一问题。 首先我们来看一看mt_rand()函数的语法: mt_rand    ( in…

    2025年3月5日
    200
  • php isset怎么检测变量是否设置

    php isset函数的作用就是检测变量是否设置,其语法是“bool isset( mixed var [, mixed var [, …]] )”,如果被检测的变量存在则返回TRUE,否则返回FALSE。 本文操作环境:win…

    2025年3月5日
    200
  • php执行exec权限不足怎么办

    php执行exec权限不足的解决办法:1、修改php脚本有读取及运行gcc文件路径的权限;2、运行此脚本的iis账户不能用默认的账号。 本文操作环境:windows7系统、PHP7.1版,DELL G3电脑 需要注意两方面的权限 一是php…

    2025年3月5日
    200
  • php怎么判断是不是素数

    php判断是不是素数的方法:首先创建一个PHP示例文件;然后通过自定义的“function check_ss($num) {…}”方法判断指定数字是不是素数即可。 本文操作环境:windows7系统、PHP7.1版,DELL G…

    2025年3月5日
    200
  • php数组怎么增加值

    php数组增加值的方法:首先创建一个PHP示例文件;然后通过“array(“red”,”green”);”创建一个数组;最后通过“array_push($a,”blue&#8221…

    2025年3月5日
    200
  • php 16进制颜色怎么转rgb

    php 16进制颜色转rgb的方法:首先创建一个PHP示例文件;然后通过“public static function hex2rgb($color){…}”方法将十六进制颜色转RGB颜色值即可。 本文操作环境:windows7…

    2025年3月5日
    100
  • php数组怎么删除头尾

    php数组删除头尾的方法:1、通过“array_shift”将数组开头的单元移出数组;2、通过“array_pop”将数组最后一个单元弹出即可。 本文操作环境:windows7系统、PHP7.1版,DELL G3电脑 删除开头的单元元素 a…

    2025年3月5日
    200
  • php数组怎么取前几个元素

    php数组取前几个元素的方法:首先新建一个php文件;然后创建一个数组;最后使用“array_splice”函数从“$arr”数组中取前三个元素即可。 本文操作环境:windows7系统、PHP7.1版,DELL G3电脑 新建一个php文…

    2025年3月5日 编程技术
    200
  • php中数字转字符串的函数有哪些

    php中数字转字符串的函数:1、strval(),语法格式“strval (数字变量)”,可获取并返回变量的字符串值;2、settype(),语法格式“settype(数字变量,’string’)”,可将变量设置为“…

    2025年3月5日
    200
  • 解析php中sprintf()函数(附代码实例)

    上一篇文章我们介绍了《php中产生随机数的两种方式》,本文来介绍sprintf()函数。php在输出字符串时可能需要连续包含多个变量,如果直接使用echo则需要将各个变量和字符串进行拼接,会比较麻烦,所以我们可以使用sprintf()函数来…

    2025年3月5日
    200

发表回复

登录后才能评论