ホームページ  >  記事  >  バックエンド開発  >  PHP はコンテンツの一部をアスタリスクに置き換えます_PHP チュートリアル

PHP はコンテンツの一部をアスタリスクに置き換えます_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:19:50837ブラウズ

PHP はコンテンツの一部をアスタリスクに置き換えます

最近のプロジェクトで、誰かの携帯電話番号の中間の桁を非表示にして、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
スターを置き換える
開始は正の数、長さは負の数です
開始は負の数、長さは負の数です
startは正の数、長さは0です 挿入操作を実行します
開始は負の数、長さは0です 挿入操作を実行します
3. ソースコードの共有
コードをコピー
パブリック静的関数 replaceStar($str, $start, $length = 0)
{
$i = 0;
$star = '';
if($start >= 0) {
En if ($ 長さ & gt; 0) {
$str_len = strlen($str);
$count = $length;
T If ($ Start & GT; = $ Str_len) {// 開始入札額が文字列の長さより大きい場合、文字列は置き換えられません
$count = 0;
}
}elseif($length
$str_len = strlen($str);
$count = abs($length);
T if ($ Start & GT; = $ Str_len) {// 開始入札額が文字列の長さより大きい場合、逆なので最後の文字の末尾から開始します
$start = $str_len - 1;
}
$offset = $start - $count + 1;//開始点の添字から数量を減算してオフセットを計算します
$count = $offset >= 0 ? abs($length) : ($start + 1);//オフセットが 0 以上の場合は、左端の点を超えていないことを意味し、 0未満の場合は、左端の点を超えていることを意味するので、開始点の左端の長さを使用します
$start = $offset &g t;= 0 ?
}else {
$str_len = strlen($str);
$count = $str_len - $start;// 交換する数量を計算します
}
}else {
En if ($ 長さ & gt; 0) {
$offset = abs($start);
}elseif($length $str_len = strlen($str);
$end = $str_len + $start;//オフセットの終了値を計算します
E $ 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');
}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/871181.html技術記事 PHP は、最近のコンテンツでコンテンツの一部をスター番号に置き換えますが、特定の人の携帯電話番号の中間位置に到達する可能性があり、個人番号コードは最後の尾 4 番目の要求のみを表示します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。