【问题标题】:Validating list of email extention set as JSON in JavaScript验证在 JavaScript 中设置为 JSON 的电子邮件扩展列表
【发布时间】:2017-02-21 21:26:44
【问题描述】:

如何验证用户输入的电子邮件并使用 JSON 中的电子邮件扩展名列表检查他们的扩展名?

就像我输入 abc@efg.com 一样,它只会检查 JSON 列表中的电子邮件扩展名 @efg.com。

或者一个只会获取“@”之后的值并忽略之前的任何内容的正则表达式。

[
    {
        "School": "Ivy Tech Community College",
        "Email": "ivytech.edu"
    },
    {
        "School": "Liberty University",
        "Email": "liberty.edu"
    },
    {
        "School": "Miami Dade College",
        "Email": "mdc.edu"
    },
    {
        "School": "Lone Star College",
        "Email": "lonestar.edu"
    },
    {
        "School": "Ashford University",
        "Email": "ashford.edu"
    }
]

【问题讨论】:

  • 你真的需要一个正则表达式吗?为什么不直接将电子邮件字符串按@ 拆分并从中获取后半部分?
  • 顺便说一句,它被称为域,而不是扩展。扩展名是文件名的结尾,例如.jpg.html

标签: javascript json regex


【解决方案1】:

除了正则表达式,您可以遍历学校数组,并像这样匹配域:

var schools = [
    {"School":"Ivy Tech Community College","Email":"ivytech.edu"},
    {"School":"Liberty University","Email":"liberty.edu"},
    {"School":"Miami Dade College","Email":"mdc.edu"},
    {"School":"Lone Star College","Email":"lonestar.edu"},
    {"School":"Ashford University","Email":"ashford.edu"}
]

function validate(email) {
    var domain = email.split('@').pop();
    for(var i = 0; i < schools.length; i++) {
        if(domain === schools[i].Email) return schools[i].School;
    }

    return 'Domain Not Found';
}

您可以将schools[i].School 替换为true 并将'Domain Not Found' 替换为false 以检查它是否存在。

示例:https://jsfiddle.net/TheQueue841/gwhkq520/

【讨论】:

    【解决方案2】:

    提到的类似垃圾箱的东西会起作用:

    var edus = [
        {"School":"Ivy Tech Community College","Email":"ivytech.edu"},
        {"School":"Liberty University","Email":"liberty.edu"},
        {"School":"Miami Dade College","Email":"mdc.edu"},
        {"School":"Lone Star College","Email":"lonestar.edu"},
        {"School":"Ashford University","Email":"ashford.edu"}
    ];
    
    var emails = ['matty.fake@lonestar.edu','himom@mdc.edu','randomguy@yahoo.com'];
    
    emails.forEach(function(element,index) {
      var domain = element.substring(element.indexOf('@') + 1);
      var match = 'none';
      if (domain) {
        edus.forEach(function(element,ind) {
          if (element.Email === domain) {
            match = element.School;
          }
        });
        console.log(element + ' matched ' + match);
      }
    });
    
    // matty.fake@lonestar.edu matched Lone Star College
    // himom@mdc.edu matched Miami Dade College
    // randomguy@yahoo.com matched none
    

    【讨论】:

      【解决方案3】:
      // initial data
      var data = '[ {"School":"Ivy Tech Community College","Email":"ivytech.edu"},' + '{"School":"Liberty University","Email":"liberty.edu"},' + '{"School":"Miami Dade College","Email":"mdc.edu"},' + '{"School":"Lone Star College","Email":"lonestar.edu"},' + '{"School":"Ashford University","Email":"ashford.edu"} ]';
      
      // json-ify our data
      var jsonData = JSON.parse(data);
      
      // map the values of each JSON 'Email' property from jsonData in an array 
      var emailsArray = jsonData.map(function (x) { return x.Email; });
      
      // email address for testing
      var testEmail = "john@liberty.edu";
      
      // split the email address by the "@" character and use the second part (domain)
      if (arrayContains(testEmail.split("@")[1], emailsArray))
      {
          // this will fire as john@liberty.edu matches liberty.edu in emailsArray
          console.log("emailsArray contains domain");
      }
      else
      {
          console.log("emailsArray does not contain domain");
      }
      
      // function to check if an item is contained in an array
      function arrayContains(item, array)
      {
          return (array.indexOf(item) > -1);
      }
      

      完整的 JSFiddle 示例here

      注意事项:

      • 您可以忽略前两行代码,因为我猜您是从 Web 响应中获取 JSON 数据
      • 假设testEmail 遵循电子邮件地址的格式;您可能需要实施某种验证来验证输入的字符串是实际的电子邮件
      • 我们将testEmail 拆分为@ 字符并使用String.prototype.split() 获得结果的第二部分(将在索引1 处,因为数组是从零开始的)
      • emailsArray 数组是使用 Array.prototype.map() 函数创建的
      • arrayContains 使用String.prototype.indexOf() 方法检查testEmail 是否存在于emailsArray

      我想我已经阐明了示例中每一行代码的作用。您现在可以使用它并根据自己的要求进行调整——甚至更好的是,改进它。

      【讨论】:

        【解决方案4】:

        如果您只想验证,请使用Array.prototype.some()

        some() 对数组中存在的每个元素执行一次回调函数,直到找到一个回调函数返回一个真值(转换为布尔值时变为真值的值)。如果找到这样的元素, some() 立即返回 true。否则, some() 返回 false。回调仅针对已分配值的数组索引调用;它不会为已删除或从未被赋值的索引调用。

        var schools = [
            {"School":"Ivy Tech Community College","Email":"ivytech.edu"},
            {"School":"Liberty University","Email":"liberty.edu"},
            {"School":"Miami Dade College","Email":"mdc.edu"},
            {"School":"Lone Star College","Email":"lonestar.edu"},
            {"School":"Ashford University","Email":"ashford.edu"}
        ]
        
        function validate(email) {
            var domain = email.split('@').pop();
            return schools.some(function(school) {
            	return school.Email === domain;
            });
        }
        
        validate('test@ashford.edu');

        【讨论】:

          猜你喜欢
          • 2021-05-23
          • 2023-04-06
          • 2011-10-20
          • 2011-02-16
          • 1970-01-01
          • 2014-06-30
          • 1970-01-01
          • 2013-07-14
          • 1970-01-01
          相关资源
          最近更新 更多