Maison  >  Article  >  développement back-end  >  Comment implémenter le remplacement partiel en PHP

Comment implémenter le remplacement partiel en PHP

藏色散人
藏色散人original
2021-05-08 09:23:321808parcourir

Comment implémenter le remplacement partiel en PHP : 1. Implémenter le remplacement partiel via la fonction "substr_replace" ; 2. Implémenter le remplacement partiel via la fonction de remplacement d'astérisque "replaceStar($str, $start, $length) =0)" remplacer.

Comment implémenter le remplacement partiel en PHP

L'environnement d'exploitation de cet article : système windows7, version PHP7.1, ordinateur DELL G3

PHP réalise un remplacement partiel, utilise PHP pour remplacer certains contenus par des astérisques

Dans un projet récent, j'ai rencontré le besoin de masquer les chiffres du milieu du numéro de téléphone portable de quelqu'un et d'afficher uniquement les 4 derniers chiffres du numéro d'identification. Au début, j'ai cherché en ligne et j'ai vu que quelqu'un utilisait la fonction substr_replace pour la remplacer. J'ai également utilisé cette fonction plus tard, mais elle n'était pas très utile lorsque je l'utilisais.

1. substr_replace

Tout d'abord, jetons un œil à la syntaxe de cette fonction :

Le code est le suivant :

substr_replace(string,replacement,start,length)
Paramètre Description
chaîne Obligatoire. Spécifie la chaîne à vérifier.
remplacement Obligatoire. Spécifie la chaîne à insérer.
début

Obligatoire. Spécifie où dans la chaîne commencer le remplacement.

Nombre positif - commencez à remplacer au décalage de début

Remplacer commençant à début

décalé par rapport à la fin de la chaîne 0 - dans la chaîne Start en remplaçant le premier caractère de

liste de chars

facultatif. Spécifie le nombre de caractères à remplacer.

Nombre positif - la longueur de la chaîne remplacée

Nombre négatif - le nombre de caractères remplacés à partir de la fin de la chaîne

 0 - insérer au lieu de remplacer

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

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

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

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

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

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

推荐学习:《PHP视频教程

二、自制的星号替换函数

代码如下:

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

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

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

  • 当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 .= &#39;*&#39;;
  $i++;
 }

 return substr_replace($str, $star, $start, $count);
}

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

  • 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(&#39;123456789&#39;, 3, 2);
 $this->assertEquals($actual, &#39;123**6789&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, 9);
 $this->assertEquals($actual, &#39;123456789&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, 9, 2);
 $this->assertEquals($actual, &#39;123456789&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, 9, -9);
 $this->assertEquals($actual, &#39;*********&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, 9, -10);
 $this->assertEquals($actual, &#39;*********&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, 9, -11);
 $this->assertEquals($actual, &#39;*********&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, 3);
 $this->assertEquals($actual, &#39;123******&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, 0);
 $this->assertEquals($actual, &#39;*********&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, 0, 2);
 $this->assertEquals($actual, &#39;**3456789&#39;);

 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, 3, -3);
 $this->assertEquals($actual, &#39;1***56789&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, 1, -5);
 $this->assertEquals($actual, &#39;**3456789&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, 3, -3);
 $this->assertEquals($actual, &#39;1***56789&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, -3, 2);
 $this->assertEquals($actual, &#39;123456**9&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, -3, 5);
 $this->assertEquals($actual, &#39;123456***&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, -1, 2);
 $this->assertEquals($actual, &#39;12345678*&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, -1, -2);
 $this->assertEquals($actual, &#39;1234567**&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, -4, -7);
 $this->assertEquals($actual, &#39;******789&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, -1, -3);
 $this->assertEquals($actual, &#39;123456***&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, -1);
 $this->assertEquals($actual, &#39;*********&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, -2);
 $this->assertEquals($actual, &#39;********9&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, -9);
 $this->assertEquals($actual, &#39;*23456789&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, -10);
 $this->assertEquals($actual, &#39;123456789&#39;);
 
 $actual = App_Util_String::replaceStar(&#39;123456789&#39;, -10, -2);
 $this->assertEquals($actual, &#39;123456789&#39;);
 }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn