如何在 C# 中做 masking/hiding 电子邮件地址
how to do masking/hiding email address in c#
我有一个问题,我必须在 c# 中应用电子邮件地址的 masking/hiding 部分。示例
jhon@abc.com==> jh**n@abc.com
bigjhon@abc.com==> bi****n@abc.com
brotherhood@abc.com==>br*******od@abc.com
我有这个代码,但它对某些电子邮件给出了例外。 "Index was outside the bounds of the array."
for (int i = 0; i < eml.Length; i++)
{
int j = i == (eml.Length - 1) ? 0 : 1;
cc = eml[i].ToString();
if (i <= 1)
{
dispeml += cc;
}
else
if (eml[i + (j + k)].ToString() == "@")
{
dispeml += cc;
k = 0;
fl = 1;
}
else
if (eml[i + j].ToString() == "@")
{
dispeml += cc;
fl = 1;
}
else
if (fl == 1)
{
dispeml += cc;
}
else
{
dispeml += "*";
}
}
我在你的代码片段中看不到你的 k 变量是在哪里初始化的。如果我不得不对你为什么得到一个索引越界异常进行大胆的尝试,那将是我的尝试。
尽管我会说您可以实现与您使用 Regex 所做的非常相似的事情。我是这样做的:
public string ObfuscateEmail(string email)
{
var displayCase = email;
var partToBeObfuscated = Regex.Match(displayCase, @"[^@]*").Value;
if (partToBeObfuscated.Length - 3 > 0) {
var obfuscation = "";
for (var i = 0; i < partToBeObfuscated.Length - 3; i++) obfuscation += "*";
displayCase = String.Format("{0}{1}{2}{3}", displayCase[0], displayCase[1], obfuscation, displayCase.Substring(partToBeObfuscated.Length - 1));
} else if (partToBeObfuscated.Length - 3 == 0) {
displayCase = String.Format("{0}*{1}", displayCase[0], displayCase.Substring(2));
}
return displayCase;
}
这里是 fiddle 所有测试用例,提供的测试结果与您描述的非常接近 https://dotnetfiddle.net/fU2RUo
[编辑] 我的代码不会尝试混淆 @ 之前的地址长度少于 3 个字符的电子邮件,如果这是一个要求,您需要修改代码,但我不认为这是一个必须建立案例的非常现实的案例。
这是使用 Regex 解决此问题的方法
string input = "jhon@abc.com";
string pattern = @"(?<=[\w]{1})[\w-\._\+%]*(?=[\w]{1}@)";
string result = Regex.Replace(input, pattern, m => new string('*', m.Length));
//j**n@abc.com
解释:
(?<=[\w]{1})
名称必须以 1 个单词字符开头
[\w-\._\+%]*
替换部分可以包含 0-n 个单词字符,包括 -_.+%
(?=[\w]{1}@)
名称必须以一个单词字符结尾,后跟 @
根据您希望保持不变的字符数量,您可以在开头或结尾将 {1}
更改为 {2}
或其他内容。
如果你总是想用固定数量的屏蔽字符屏蔽@之前第一个字符和最后一个字符之间的任何内容,你可以使用下面的
var email="abcdef@ghij.com";
var maskedEmail = string.Format("{0}****{1}", email[0],
email.Substring(email.IndexOf('@')-1));
您可以根据需要更改上面的行。
上面一行会给你结果"a****f@ghij.com"
请注意,始终使用固定数量的字符来屏蔽电子邮件会使电子邮件更难被猜到,并且稍微更安全一些。
例如:ab@c.com
掩码后:a****b@c.com
我编写此方法是因为它更容易根据我的特定屏蔽要求进行自定义。
- 输入:myemail@address.com
- 输出:m****il@*******.com
我希望这对某人有所帮助。如果是这样,请将答案标记为有用。
public static string MaskEmail(this string email)
{
var emailsplit = email.Split('@');
var newsplit = emailsplit[1].Split('.');
char[] array1 = emailsplit[0].ToCharArray();
char[] array2 = newsplit[0].ToCharArray();
var output = "";
for (int i = 0; i < array1.Length; i++)
{
if (array1.Length > 4)
{
if (i == 0 || i == array1.Length - 1 || i == array1.Length - 2)
{
output += array1[i];
}
else
{
output += "*";
}
}
else
{
if (i == 0)
{
output += array1[i];
}
else
{
output += "*";
}
}
}
output += "@";
for (int i = 0; i < array2.Length; i++) output += "*";
for (int i = 1; i < newsplit.Length; i++) output += "." + newsplit[i];
return output;
}
我想屏蔽这样的电子邮件 A****B@C****D.com。这也适用于具有多个点或没有域扩展名的电子邮件。
public string MaskEmail(string email)
{
if (string.IsNullOrEmpty(email) || !email.Contains("@"))
return email;
string[] emailArr = email.Split('@');
string domainExt = Path.GetExtension(email);
string maskedEmail = string.Format("{0}****{1}@{2}****{3}{4}",
emailArr[0][0],
emailArr[0].Substring(emailArr[0].Length - 1),
emailArr[1][0],
emailArr[1].Substring(emailArr[1].Length - domainExt.Length - 1, 1),
domainExt
);
return maskedEmail;
}
结果
info@stakofervlow.com >> i****o@s****w.com
me@google.nl >> m****e@g****e.nl
webmaster@stack.over.flow.org >> w****r@s****w.org
test@noextension >> t****t@n****n
x@y.net >> x****x@y****y.net
public static string EmailStarString(string email)
{
string[] parts = email.Split('@');
string star = string.Empty;
string firstCharEmailName = parts[0].First().ToString();
string lastCharEmailName = parts[0].Last().ToString();
for (int i = 0; i < parts[0].Length - 2; i++)
{
star += "*";
}
return firstCharEmailName + star + lastCharEmailName + "@" + parts[1];
}
我会采取另一种方法,知道@是一个电子邮件地址,如果@和字母之前有字母并且@符号之后有@*。然后取去掉 space 之间包含 @ 和点“.”的文本部分,现在我们可以安全地过滤那些短为电子邮件的部分
var parts = someText.Split(' ').ToArray();
for (var i=0;i<parts.Length;i++)
{
if (parts[i].Length>5 && parts[i].Any(a => a.Equals('@')) && parts[i].Any(a => a.Equals('.')))
{
parts[i] = "EMAIL@REMOVED.COM";
}
}
someText = string.Join(' ', parts);
您可以替换白色的整个块-space,或者花点时间替换一些字母或单词。不像正则表达式巫术那么花哨,但对我有用。顺便说一句,您还可以通过将其包含在您的“任何”逻辑中来捕获诸如 email(a)mydomain[dot]com 之类的内容
我有一个问题,我必须在 c# 中应用电子邮件地址的 masking/hiding 部分。示例
jhon@abc.com==> jh**n@abc.com
bigjhon@abc.com==> bi****n@abc.com
brotherhood@abc.com==>br*******od@abc.com
我有这个代码,但它对某些电子邮件给出了例外。 "Index was outside the bounds of the array."
for (int i = 0; i < eml.Length; i++)
{
int j = i == (eml.Length - 1) ? 0 : 1;
cc = eml[i].ToString();
if (i <= 1)
{
dispeml += cc;
}
else
if (eml[i + (j + k)].ToString() == "@")
{
dispeml += cc;
k = 0;
fl = 1;
}
else
if (eml[i + j].ToString() == "@")
{
dispeml += cc;
fl = 1;
}
else
if (fl == 1)
{
dispeml += cc;
}
else
{
dispeml += "*";
}
}
我在你的代码片段中看不到你的 k 变量是在哪里初始化的。如果我不得不对你为什么得到一个索引越界异常进行大胆的尝试,那将是我的尝试。
尽管我会说您可以实现与您使用 Regex 所做的非常相似的事情。我是这样做的:
public string ObfuscateEmail(string email)
{
var displayCase = email;
var partToBeObfuscated = Regex.Match(displayCase, @"[^@]*").Value;
if (partToBeObfuscated.Length - 3 > 0) {
var obfuscation = "";
for (var i = 0; i < partToBeObfuscated.Length - 3; i++) obfuscation += "*";
displayCase = String.Format("{0}{1}{2}{3}", displayCase[0], displayCase[1], obfuscation, displayCase.Substring(partToBeObfuscated.Length - 1));
} else if (partToBeObfuscated.Length - 3 == 0) {
displayCase = String.Format("{0}*{1}", displayCase[0], displayCase.Substring(2));
}
return displayCase;
}
这里是 fiddle 所有测试用例,提供的测试结果与您描述的非常接近 https://dotnetfiddle.net/fU2RUo
[编辑] 我的代码不会尝试混淆 @ 之前的地址长度少于 3 个字符的电子邮件,如果这是一个要求,您需要修改代码,但我不认为这是一个必须建立案例的非常现实的案例。
这是使用 Regex 解决此问题的方法
string input = "jhon@abc.com";
string pattern = @"(?<=[\w]{1})[\w-\._\+%]*(?=[\w]{1}@)";
string result = Regex.Replace(input, pattern, m => new string('*', m.Length));
//j**n@abc.com
解释:
(?<=[\w]{1})
名称必须以 1 个单词字符开头
[\w-\._\+%]*
替换部分可以包含 0-n 个单词字符,包括 -_.+%
(?=[\w]{1}@)
名称必须以一个单词字符结尾,后跟 @
根据您希望保持不变的字符数量,您可以在开头或结尾将 {1}
更改为 {2}
或其他内容。
如果你总是想用固定数量的屏蔽字符屏蔽@之前第一个字符和最后一个字符之间的任何内容,你可以使用下面的
var email="abcdef@ghij.com";
var maskedEmail = string.Format("{0}****{1}", email[0],
email.Substring(email.IndexOf('@')-1));
您可以根据需要更改上面的行。
上面一行会给你结果"a****f@ghij.com"
请注意,始终使用固定数量的字符来屏蔽电子邮件会使电子邮件更难被猜到,并且稍微更安全一些。
例如:ab@c.com
掩码后:a****b@c.com
我编写此方法是因为它更容易根据我的特定屏蔽要求进行自定义。
- 输入:myemail@address.com
- 输出:m****il@*******.com
我希望这对某人有所帮助。如果是这样,请将答案标记为有用。
public static string MaskEmail(this string email)
{
var emailsplit = email.Split('@');
var newsplit = emailsplit[1].Split('.');
char[] array1 = emailsplit[0].ToCharArray();
char[] array2 = newsplit[0].ToCharArray();
var output = "";
for (int i = 0; i < array1.Length; i++)
{
if (array1.Length > 4)
{
if (i == 0 || i == array1.Length - 1 || i == array1.Length - 2)
{
output += array1[i];
}
else
{
output += "*";
}
}
else
{
if (i == 0)
{
output += array1[i];
}
else
{
output += "*";
}
}
}
output += "@";
for (int i = 0; i < array2.Length; i++) output += "*";
for (int i = 1; i < newsplit.Length; i++) output += "." + newsplit[i];
return output;
}
我想屏蔽这样的电子邮件 A****B@C****D.com。这也适用于具有多个点或没有域扩展名的电子邮件。
public string MaskEmail(string email)
{
if (string.IsNullOrEmpty(email) || !email.Contains("@"))
return email;
string[] emailArr = email.Split('@');
string domainExt = Path.GetExtension(email);
string maskedEmail = string.Format("{0}****{1}@{2}****{3}{4}",
emailArr[0][0],
emailArr[0].Substring(emailArr[0].Length - 1),
emailArr[1][0],
emailArr[1].Substring(emailArr[1].Length - domainExt.Length - 1, 1),
domainExt
);
return maskedEmail;
}
结果
info@stakofervlow.com >> i****o@s****w.com
me@google.nl >> m****e@g****e.nl
webmaster@stack.over.flow.org >> w****r@s****w.org
test@noextension >> t****t@n****n
x@y.net >> x****x@y****y.net
public static string EmailStarString(string email)
{
string[] parts = email.Split('@');
string star = string.Empty;
string firstCharEmailName = parts[0].First().ToString();
string lastCharEmailName = parts[0].Last().ToString();
for (int i = 0; i < parts[0].Length - 2; i++)
{
star += "*";
}
return firstCharEmailName + star + lastCharEmailName + "@" + parts[1];
}
我会采取另一种方法,知道@是一个电子邮件地址,如果@和字母之前有字母并且@符号之后有@*。然后取去掉 space 之间包含 @ 和点“.”的文本部分,现在我们可以安全地过滤那些短为电子邮件的部分
var parts = someText.Split(' ').ToArray();
for (var i=0;i<parts.Length;i++)
{
if (parts[i].Length>5 && parts[i].Any(a => a.Equals('@')) && parts[i].Any(a => a.Equals('.')))
{
parts[i] = "EMAIL@REMOVED.COM";
}
}
someText = string.Join(' ', parts);
您可以替换白色的整个块-space,或者花点时间替换一些字母或单词。不像正则表达式巫术那么花哨,但对我有用。顺便说一句,您还可以通过将其包含在您的“任何”逻辑中来捕获诸如 email(a)mydomain[dot]com 之类的内容