検索
ホームページバックエンド開発PHPの問題PHPで部分置換を実装する方法

PHPでの部分置換の実装方法: 1.「substr_replace」関数で部分置換を実装; 2.自作のアスタリスク置換関数「replaceStar($str, $start, $length)で部分置換を実装」 =0)」を置き換えます。

PHPで部分置換を実装する方法

この記事の動作環境:Windows7システム、PHP7.1バージョン、DELL G3コンピュータ

PHPの一部置き換えを実現し、 PHP を使用してコンテンツの一部をアスタリスクに置き換えます

最近のプロジェクトで、誰かの携帯電話番号の中央の桁を非表示にし、ID 番号の最後の 4 桁のみを表示する必要があることに遭遇しました。最初はネットで検索して、substr_replace関数を使って置き換えている人がいたので、後からこの関数も使いましたが、実際に使ってみるとあまり便利ではありませんでした。

1. substr_replace

まず、この関数の構文を見てみましょう:

コードは次のとおりです:

substr_replace(string,replacement,start,length)
##説明#文字列# ### ###必須。チェックする文字列を指定します。 必須。挿入する文字列を指定します。 必須。文字列内のどこから置換を開始するかを指定します。
#パラメータ
交換
#start

正の数値 - start offset

から置換を開始します。 負の数値 - # を置換しますstart 文字列の末尾から 番目のオフセット

0 - 文字列内 置換開始

charlist

最初の文字。オプション。置換する文字数を指定します。

正の数 - 置換される文字列の長さ

負の数 - 置換される文字列の末尾からの文字数文字列

0 -

を置換する代わりに挿入します。
  • 当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;);
 }

以上がPHPで部分置換を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么设置implode没有分隔符php怎么设置implode没有分隔符Apr 18, 2022 pm 05:39 PM

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。