我正在寻找一些脚本的帮助,该脚本使变量的电子邮件输出部分隐藏在@之前,就像我有电子邮件一样
verysecretemail@gmail.com
我需要在输出中"随机"将星星放在那里,例如:
ver***@gmail.com
verys*********************@gmail.com
ve*@gmail.com
但不像:
ver***mail.com
verysecre****ail.com
只是随机使用星星(或者可能是静态的),它不会在@字符之前
我尝试过这样的事情
$output = substr_replace($val, '********', 2, 7);
其中$val = $email;
$mail = "verysecretemail@gmail.com";
$mailparts = explode("@", $mail);
$output = substr($mailparts[0],0,rand(2,5)) . str_repeat("*",rand(1,16));
$output .= "@" . $mailparts[1];
像这样的事情怎么样:
$asterisks = "";
for($i = 0; $i < strlen(substr($address, 0, strpos($address, "@"))); $i++)
$asterisks = $asterisks . "*"; //This loop sets the required number of asterisks
$address = str_replace(substr($address, 0, strpos($address, "@") - 1), $asterisks);
//everything before the '@' is replaced by an asterisk
以下是使用子字符串执行此操作的更易于阅读的方法:
$emails = array(
'verysecretemail@gmail.com',
'example@example.org',
'someotheremail@example.com',
);
function obfuscate_email($email) {
$at_position = strpos($email, '@');
$chop = rand(1, $at_position - 1);
$mask = str_repeat('*', rand(4, 8));
$partial_address = substr($email, 0, $chop);
$domain = substr($email, $at_position);
return $partial_address . $mask . $domain;
}
foreach($emails as $email) {
var_dump(obfuscate_email($email));
}
// Output:
// string(18) "ver*****@gmail.com"
// string(24) "exam********@example.org"
// string(17) "s****@example.com"
可以在 http://ideone.com/21HKd
如您所见,我已将代码分解到一个函数中,以使其更易于使用。该函数将为您提供一个经过混淆的电子邮件地址,其中包含:
- 原始地址的随机印章(考虑到其长度)
- 星号的随机掩码
如果我自己实际实现此功能,那么我将确保我尝试混淆的电子邮件地址长度超过 3 个字符,并适当调整$chop
长度,以便您可以确保尽可能多地隐藏。