【问题标题】:how to do masking/hiding email address in c#如何在 C# 中屏蔽/隐藏电子邮件地址
【发布时间】:2015-08-04 10:14:28
【问题描述】:

我有一个问题,我必须在 c# 中应用屏蔽/隐藏电子邮件地址的一部分。例子

jhon@abc.com==> jh**n@abc.com
bigjhon@abc.com==> bi****n@abc.com
brotherhood@abc.com==>br*******od@abc.com

我有这个代码,但它对某些电子邮件给出了例外。 “索引超出了数组的范围。”

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 += "*";
 }
}

【问题讨论】:

  • “为某些电子邮件提供例外”:我想我们可以猜到它们是什么。但最好在代码中包含哪些电子邮件失败、哪些异常以及哪些点失败的详细信息。
  • 实际上该代码已在网站上运行,我没有这些电子邮件地址详细信息,但我只收到此错误。
  • 你为什么不启动你的调试器,看看这段代码发生了什么?您处于发现故障的最佳位置。只需在此代码的开头放置一个断点并运行调试器即可。
  • 我做了,但很好,这就是我把它放在这里的原因。可能是我错过了一些东西,所以其他人可以帮助我
  • 您是否有示例测试电子邮件地址可以显示哪些失败?

标签: c# c#-4.0 c#-3.0 c#-2.0


【解决方案1】:

这是一种使用正则表达式解决此问题的方法

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

说明

(?&lt;=[\w]{1}) 名称必须以 1 个单词字符开头

[\w-\._\+%]* 替换部分可以包含 0-n 个单词字符,包括 -_.+%

(?=[\w]{1}@)名称必须以一个单词字符结尾,后跟@

根据您希望保持不变的字符数量,您可以在开头或结尾将{1} 更改为{2} 或其他内容。

【讨论】:

  • 很好的解决方案。感谢您的正则表达式! :)
  • 如何让这也影响电子邮件地址的域?
  • @Djorge 这有点棘手,因为从技术上讲,域是@foo@foo.bar.com@192.168.1.1,除了琐碎的情况@foo.com
  • 我最终将|(?&lt;=@[\w]{1})[\w-_\+%]*(?=\.) 添加到您的正则表达式的末尾以获得我想要的,但不处理@foo
  • @Djorge 如果您删除添加中的 at 符号,您还可以匹配多个域部分。整个表达式将是 (?
【解决方案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

【讨论】:

    【解决方案3】:

    我看不到你的 k 变量在你的代码 sn-p 中的初始化位置。如果我不得不猛烈抨击为什么你会得到一个索引超出范围的异常,那将是我的刺。

    虽然我会说您可以实现与使用 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;
    }
    

    这里是你所有测试用例的一个小提琴,只要通过非常接近你描述的https://dotnetfiddle.net/fU2RUo

    [编辑] 我的代码不会尝试混淆 @ 之前的地址长度小于 3 个字符的电子邮件,如果这是您需要修改代码的要求,但我认为这不太现实必须建立一个案例。

    【讨论】:

      【解决方案4】:

      我想屏蔽像 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
      

      【讨论】:

        【解决方案5】:

        我编写此方法是因为它更容易根据我的特定屏蔽要求进行自定义。

        • 输入: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;
            }
        

        【讨论】:

          【解决方案6】:
            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];
              }
          

          【讨论】:

            【解决方案7】:

            我会采取另一种方法,知道@是一个电子邮件地址,如果@之前有字母,字母和@*.在@符号之后,则取出该部分包含@和点“.”的空格之间的文本,现在我们可以安全地过滤那些短为电子邮件的文本

            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); 
            

            您可以在空白处替换整个块,或者花哨并替换一些字母或单词。不像正则表达式巫毒教那么花哨,但对我有用。顺便说一句,您还可以通过将其包含在“任何”逻辑中来捕获诸如 email(a)mydomain[dot]com 之类的内容

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-02-12
              • 2013-10-16
              • 1970-01-01
              • 2018-10-21
              • 1970-01-01
              • 1970-01-01
              • 2016-01-21
              • 1970-01-01
              相关资源
              最近更新 更多