最近のプロジェクトで、誰かの携帯電話番号の中間の桁を非表示にして、ID 番号の最後の 4 桁のみを表示する必要があることに遭遇しました。最初はネットで検索して、substr_replace関数を使って置き換えているのを見つけましたが、後からこの関数も使いましたが、実際に使ってみるとあまり役に立ちませんでした。
1.substr_replace
この関数の構文を見てみましょう:
substr_replace(文字列,置換,開始,長さ)
パラメータ 説明
文字列 必須。チェックする文字列を指定します。
交換 必須。挿入する文字列を指定します。
開始
必須。文字列内のどこから置換を開始するかを指定します。
正の数 - 開始オフセットで
の置換を開始します
負の数値 - 文字列の末尾からの開始オフセットから始まる
を置き換えます
0 - 文字列の最初の文字から
の置換を開始します
チャーリスト
オプション。置換する文字数を指定します。
正の数値 - 置換される文字列の長さ
負の数 - 文字列の末尾から置換される文字数
0 - 置換の代わりに挿入
1. start と charlist が両方とも正の数の場合、以下に示すように、Start は 0 から始まり、置き換えられる要素になります。 🎜>
2. start が負の数、charlist が正の数の場合は理解しやすいです
3. start が正の数で charlist が負の数の場合、私は最初これを誤解しました
4. start が負の数で、charlist が負の数である場合、注意すべき点が 1 つあります。start が負の数で、length が start 以下の場合、length は 0 です。この罠は非常に簡単に足を踏み入れることができます
5. charlist が 0 の場合、置換ではなく挿入になります。 。 。
使ってみると、今のニーズには応えられるものの、将来的に拡張が必要になった場合にかなり使いにくくなるので、自分で構築してみようと思い立ちました。将来的には便利になります。
2. 自作アスタリスク置換機能
replaceStar($str, $start, $length = 0)
パラメータ
説明
str必須。チェックする文字列を指定します。
開始必須。文字列内のどこから置換を開始するかを指定します。
正の数 - 開始オフセットで
の置換を開始します
負の数値 - 文字列の末尾からの開始オフセットから始まる
を置き換えます
0 - 文字列の最初の文字から
の置換を開始します
長さ
オプション。置換する文字数を指定します。
正の数値 - 置換される文字列の長さ (左から右へ)
負の数値 - 置換される文字列の長さ (右から左へ)
0 - start が正の数の場合、start から開始して左に進み、最後まで
- start が負の数の場合、start から開始して右に最後まで移動します
最初の 2 つのパラメータは上記と同じですが、最後のパラメータは上記とは異なります
1. start と length が両方とも正の数値の場合、substr_replace
と同じように動作します。
2. start が負の数、length が正の数の場合、substr_replace
と同じように動作します。
substr_replace
スターを置き換える
開始は正の数、長さは負の数です
開始は負の数、長さは負の数です
開始は正の数で、長さは 0 です
挿入操作を実行します
開始値は負の数で、長さは 0 です挿入操作を実行します
3. ソースコードの共有
コードをコピー
パブリック静的関数 replaceStar($str, $start, $length = 0)
{
$i = 0;
$star = '';
if($start >= 0) {
if($length > 0) {
$str_len = strlen($str);
$count = $length;
if ($ Start & GT; = $ Str_len) {// 開始入札額が文字列の長さより大きい場合、それは置き換えられません
$count = 0;
}
}elseif($length
$str_len = strlen($str);
$count = abs($length);
$start = $str_len - 1;
}
$offset = $start - $count + 1;//開始点の添字から数量を減算し、オフセットを計算します
始点から左端までの長さを使用します
}else {
$str_len = strlen($str);
$count = $str_len - $start;//交換する数量を計算します
}
}else {
if($length > 0) {
$offset = abs($start);
$count = $offset >= $length ? $length : $offset;//長さ以上の場合、右端の
}elseif($length
$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
$star .= '*';
$i++;
}
return substr_replace($str, $star, $start, $count);
}
コードをコピー
私はアルゴリズムが苦手なので、ここでは数式を使わずにごく一般的なロジックを使って説明します。
1. if($start >= 0) start が 0 以上 0 未満の分岐です
2. 始点のうち、長さが 0 より大きい、0 より小さい、0 に等しい 3 つの枝を作成します
3. 最後に start、count、および置換するアスタリスク文字列を計算します。最終的に計算された start と count は両方とも正の数です。
4. 単体テスト
コードをコピー
パブリック関数 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');
}