ここでは、このための私の代替ソリューションです。
電子メールの元の長さに一致するマスク文字の正確な数は使用しませんが、プライバシー上の理由から固定長のマスクを使用します。また、最大許容文字を表示し、メールの半分以上を表示しないように設定します。私はまた、すべての電子メールを最小の長さ以下にマスクします。
function maskEmail($email, $minLength = 3, $maxLength = 10, $mask = "***") {
$atPos = strrpos($email, "@");
$name = substr($email, 0, $atPos);
$len = strlen($name);
$domain = substr($email, $atPos);
if (($len/2) < $maxLength) $maxLength = ($len/2);
$shortenedEmail = (($len > $minLength) ? substr($name, 0, $maxLength) : "");
return "{$shortenedEmail}{$mask}{$domain}";
}
テスト:
$email = "";
$tests = [];
for ($i=0; $i < 22; $i++) {
$email .= chr(97 + $i);
$tests[] = $email . " -> " . maskEmail("{$email}@example.com");
}
print_r($tests);
結果:
Array
(
[0] => a -> ***@example.com
[1] => ab -> ***@example.com
[2] => abc -> ***@example.com
[3] => abcd -> ab***@example.com
[4] => abcde -> ab***@example.com
[5] => abcdef -> abc***@example.com
[6] => abcdefg -> abc***@example.com
[7] => abcdefgh -> abcd***@example.com
[8] => abcdefghi -> abcd***@example.com
[9] => abcdefghij -> abcde***@example.com
[10] => abcdefghijk -> abcde***@example.com
[11] => abcdefghijkl -> abcdef***@example.com
[12] => abcdefghijklm -> abcdef***@example.com
[13] => abcdefghijklmn -> abcdefg***@example.com
[14] => abcdefghijklmno -> abcdefg***@example.com
[15] => abcdefghijklmnop -> abcdefgh***@example.com
[16] => abcdefghijklmnopq -> abcdefgh***@example.com
[17] => abcdefghijklmnopqr -> abcdefghi***@example.com
[18] => abcdefghijklmnopqrs -> abcdefghi***@example.com
[19] => abcdefghijklmnopqrst -> abcdefghij***@example.com
[20] => abcdefghijklmnopqrstu -> abcdefghij***@example.com
[21] => abcdefghijklmnopqrstuv -> abcdefghij***@example.com
)
しかし、どのような場合、ユーザーの実際の電子メールアドレスがちょうど 'のABCの@ example.com'のですか?あなたはそれからすべてを明らかにしました。ユーザー名を使った自動提示は大丈夫ですが、電子メールアドレスの自動提示はプライバシーの悪夢のようです。 –
@MichaelBerkowskiそのため、$ showLen = floor($ len/2)を使用しているので、電子メールの約半分がいつも隠されています。 – Bluemagica