【问题标题】:Parsing a 'Full Name' string to an email address将“全名”字符串解析为电子邮件地址
【发布时间】:2015-05-02 23:30:43
【问题描述】:

我正在尝试修改现有项目。请原谅我缺乏知识,我们的开发人员最近离开了公司,我正在尝试解决一个问题,直到我们雇用一个新人。

这是一个基于其他信息发送电子邮件的网络表单应用程序。所有名称均采用以下格式之一:

  1. 名字姓氏
  2. 名字姓氏姓氏2
  3. 名字姓氏-姓氏2

我只是想处理一个字符串来生成一个电子邮件地址。同样,它们遵循一个固定的格式,即 firstname.lastname@domain.com。我想通过找到第一个空格,我可以隔离姓氏并简单地删除多余的空格或连字符,但我的代码似乎不起作用。

我遇到的问题是,任何有多个姓氏的人都会导致交付失败,因为应用程序获取了错误的电子邮件地址。示例:

未能向这些收件人或群组投递:Steven.Smith (Jones@domain.com)

如果只是 Steven Jones 这个名字,它会很好用,我已经测试了好几次。

我的代码:

string fn = FullName.Text.ToString(); 
string y = fn.Substring(0, fn.IndexOf(" ")).Trim().Replace(" ", "");
string z =  fn.Substring(fn.IndexOf(" ") + 1).Trim().Replace(" ", "");
String ToAddress = y + "." + z + "@domain.com";

FullName 变量来自我猜想的这段代码,它在 page_load 类中

System.Security.Principal.WindowsIdentity wi = System.Security.Principal.WindowsIdentity.GetCurrent();
        string[] a = Context.User.Identity.Name.Split('\\');

System.DirectoryServices.DirectoryEntry ADEntry = new System.DirectoryServices.DirectoryEntry("WinNT://" + a[0] + "/" + a[1]);
        string Name = ADEntry.Properties["FullName"].Value.ToString();

有人对我如何在这里实现我的目标有任何想法吗?我为我缺乏大量知识而道歉,但我对 ASP.NET 并不完全熟悉。从我的研究来看,我可能应该将字符串拆分为一个数组,但我不知道如何在我的程序中实现它。

同样无效的原始代码如下。在我的示例中,我已尝试使其更高效并能够处理三个名称。

string myString1 = txtName.Text.ToString();
                int t = myString1.IndexOf(" ", 0);

                //Extract the first name for from address
                int q = t;
                string fn1 = this.txtName.Text.ToString();
                string b = fn1.Substring(0,q);
                //Extract the Last name for from address
                int r= t;
                string ln1 = this.txtName.Text.ToString();
                string c= fn1.Substring(r+1);

谢谢!

【问题讨论】:

  • 请展示一些示例输入和输出。
  • 两个人同名会怎样?
  • 幸运的是,没有人同名。如果有的话,我们会通过添加一个数字或其他东西来使名称不同。

标签: c# asp.net


【解决方案1】:

尚不完全清楚您的一位用户的两个姓氏的电子邮件地址应该采用什么格式,但您似乎应该能够做到

//Assuming example input "Stephen Smith-Jones" or "Stephen Smith Jones"
//split on spaces and hyphens
string[] names = FullName.Text.ToString()
                     .Split(new string[]{" ", "-"},
                            StringSplitOptions.RemoveEmptyEntries); //in case of extra spaces?

//Stephen.SmithJones@domain.com
var email = String.Format("{0}.{1}{2}@domain.com",
                          names[0],
                          names[1],
                          (names.Length > 2) ? names[2] : "");

它有什么作用?将您的全名分解为一组名称。获取第一个名字、第二个名字和(如果有的话)第三个名字并将它们放入电子邮件中。如果您想处理中间名或其他变体,则需要更加复杂。

编辑:反映 [firstname].[lastname][lastname2?]@domain.com 格式

【讨论】:

  • 我们只有少数用户名带有连字符,并且他们都输入了别名,格式为:firstname.lastnamelastname@domain.com(无连字符)。第一行会处理 Stephen Jones 以及 Stephen Smith-Jones 吗?
  • 是的;它获取任何用户全名的名字和姓氏。如果你有一个叫“James Earl Smith Count-Basie Ellington Langston Smythe-Whitford-Jones”的人,你会得到“James.Jones@domain.com” 请注意,如果你有一个有后缀的人,它会抓住它作为一个姓氏。 “亚瑟 Foobar 博士”最终会成为“Arthur.Ph.D.@domain.com”(数组实际上是{"Arthur","Foobar,","Ph.D."}
  • 如果姓名是:David Smith Robinson,电子邮件发送到 David.SmithRobinson@domain.com,是否可以修改它,而不是简单地选择名字和姓氏?我确实尝试过您的代码作为测试,但它给了我一个关于“文本”不是有效属性的错误
  • 是的,这是可能的。至于属性,我刚刚使用了您的代码,来自您帖子中的第一个代码块:string fn = FullName.Text.ToString(); 我将编辑我的答案以提供您想要的结果。
  • 谢谢你这已经完美了。感谢您的时间和精力
【解决方案2】:

这样的?

        string fn = FullName.Text.ToString();
        string forename = fn.Split(' ')[0];
        string toAddress = forename + "." + fn.Substring(forename.Length + 1) + "@domain.com";

【讨论】:

    【解决方案3】:

    您不要替换连字符:

    替换

    string z =  fn.Substring(fn.IndexOf(" ") + 1).Trim().Replace(" ", "");
    

    通过

    string z =  fn.Substring(fn.IndexOf(" ") + 1).Trim().Replace(" ", "").Replace("-", "");
    

    此外,您应该检查无效输入和无效邮件地址字符。这可能是一个重音字符,例如 é...

    【讨论】:

    • 我已经尝试过了,但仍然无法生成正确的电子邮件地址!无效输入将是一个问题,但它仅适用于大约 100 个用户,他们的电子邮件地址或名称中没有任何特殊字符。
    • 请显示您尝试使用的输入以及相应的错误消息/输出
    【解决方案4】:

    你可以先像这样清理你的字符串(我从this线程中得到它):

    string cleanedString = System.Text.RegularExpressions.Regex.Replace(dirtyString,@"\s+"," ");
    

    然后你可以用点替换空格和连字符:

    cleanedString = cleanedString.Trim().Replace(" ", ".").Replace("-", ".");
    

    Johan Doe Doe2 将成为 John.Doe.Doe2

    之后,您可以使用以下命令删除最后一部分:

                if (cleanedString.IndexOf('.') != cleanedString.LastIndexOf('.'))
                {
                    cleanedString = cleanedString.Substring(0, cleanedString.LastIndexOf('.'));
                }
    

    结果将是 John.Doe

    你也许可以用更好的方式来做......

    【讨论】:

      【解决方案5】:

      您可以使用正则表达式和分组:

      Regex r = new Regex("(\\w+) (\\w+)[ -]?(\\w+)?");
      
      string name = "John Anderson Johnson";
      Match m = r.Match(name);
      if(m.Success)
      {
         string first_name = m.Groups[1].Value;
         string last_name = m.Groups[2].Value;
         string last_name2 = ((m.Groups.Count > 2 && !m.Groups[3].Value.Equals(String.Empty))
            ? m.Groups[3].Value : String.Empty);
      
         // format as desired
         string email = String.Format("{0}.{1}{2}@domain.com", first_name, last_name2);
         string email2 = String.Format("{0}.{1}@domain.com", first_name, last_name);
         Console.WriteLine(email);  // outputs: John.AndersonJohnson@domain.com
         Console.WriteLine(email2); // outputs: John.Anderson@domain.com
      }
      

      更新 更新源以处理操作评论:

      输入的别名格式为:firstname.lastnamelastname@domain.com(无连字符)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-04
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-27
        • 2022-11-06
        相关资源
        最近更新 更多