【问题标题】:Writing an email validation function编写电子邮件验证函数
【发布时间】:2015-11-02 12:19:16
【问题描述】:

编写一个名为validate 的函数,它接受一个字符串参数。当且仅当字符串包含至少一个点 . 和恰好一个 @ 符号时,该函数才应返回 true。
例如。

validate ("j.nicholson@southampton.ac.uk")===true

【问题讨论】:

  • 听起来像学校作业。阅读文档,并向我们展示一些代码!这是单线!
  • 这听起来很像一个家庭作业/面试问题 - 如果是这种情况,承认和披露这一事实是谨慎的做法,因为Stack Overflow 的用户并没有真正从事其他业务人民为他们工作。展示您尝试过的内容以及遇到的问题。
  • 小提示:试试看indexOf
  • @Jakub Hampl 对于可以用简单的正则表达式完成的事情来说似乎很麻烦
  • 我同意...但是为这样的简单任务学习正则表达式对于 OP 来说可能太麻烦了。

标签: javascript validation


【解决方案1】:

即使这是家庭作业,我也会帮助你。

有几种方法可以解决这个问题。大多数时候,当您尝试验证某些输入时,您使用Regular Expressions。不过,我还可以想到另外两种方法:使用String's indexOf function,或者手动循环遍历组成字符串的字符数组。

让我们看一下indexOf 函数,它应该很简单。

在 Javascript 中,检查字符串时没有contains 函数。这有点烦人,但您可以使用indexOf 函数创建自己的函数。

因此,来自 MDN,str.indexOf(searchValue[, fromIndex]) 函数 returns the index within the calling String object of the first occurrence of the specified value, starting the search at fromIndex. Returns -1 if the value is not found.

好的,所以如果indexOf 返回非负值,我们的字符串包含我们正在搜索的字符串!

所以,让我们编写一个包含函数。

function contains(original_string, string_to_search_for) {
    // if `location_of_search_string` is 0 or greater, we have a match.
    var location_of_search_string = original_string.indexOf(string_to_search_for);
    if (location_of_search_string >= 0) {
        return true;
    } else {
        return false;
    }
}

到目前为止和我在一起?现在我们可以稍微清理一下代码,这样它就不会那么多行了。我们实际上可以让它成为一条线。注意如果我们的if 语句是true,我们还想返回true?我们可以通过返回 if 语句的计算结果来利用这一点。我们也不需要将结果存储在变量中。

好的,现在我们有

function contains(original_string, string_to_search_for) {
    return (original_string.indexOf(string_to_search_for) >= 0);
}

好的,看看我们的字符串中是否有.,我们可以运行:

var email = 'hello@example.com';
contains(email, '.'); //returns true

现在,如果我们要对一个 & 符号 (@) 运行它,如果它有至少一个 & 符号,这将返回 true,但我们想要 一个.所以,我们需要另一个函数。

有几种方法可以做到这一点,但让我们坚持使用indexOf。还记得我们可以传递indexOffromIndex 参数吗?让我们使用它。在我们找到@ 的第一次出现后,让我们开始在该位置 寻找另一个& 符号。如果我们没有找到,那么我们只有一个@

function containsJustOne(original_string, string_to_search_for) {
    var first_location = original_string.indexOf(string_to_search_for);
    if (first_location >= 0) {
        // move 1 spot after our first found index
        var second_location = original_string.indexOf(string_to_search_for, first_location + 1);
        // We want to return true if we DIDN'T find a second location,
        // aka, if it is equal to -1.
        return (second_location === -1);
    } else {
        // We didn't find any, return false right away.
        return false;
    }
}

好的!因此,我们可以创建一个函数 no,validateEmail(email),如下所示:

function validateEmail(email) {
    return (containsJustOne('@') && contains('.'));
}

只是为了好玩,如果你想用正则表达式解决这个问题,我可能会做这样的事情:

function validateEmailWithRegExp(email) {
    return /^[^@]*@[^@]*$/.test(email) && /^(?:.*\.)+.*$/.test(email);
}

单线很有趣!这几乎不是您可以使用的最优化的 reg exp,但它可以根据您的帖子完成工作。

【讨论】:

  • 好的,非常感谢,这真的解释得很好,我现在有一个很长的函数。
【解决方案2】:

如果你真的需要答案,这里就是……

var website = "x.John@example.com"
function validate(){
    var hasOneAtSymbol = false,
    hasDots = false;
    for(var i in website){
        if(website[i] === "@"){
            if(hasOneAtSymbol){
                return false;
            }else{
                hasOneAtSymbol = true;
            }
        }else if(website[i] === "."){
            hasDots = true;
        }
    }
    if(hasOneAtSymbol && hasDots){
        return true;
    }else{
        return false;
    }
}

【讨论】:

  • 就可读性而言,这写得很好。但从概念上讲,它可以改进:您可以利用一些现有的 JavaScript String 函数,使 for 循环变得不必要(更不用说正则表达式的可能性,但这完全是另一回事)。
  • 谢谢!我错过了其他陈述之一,感谢您抽出宝贵的时间!非常感谢!!!
  • 我喜欢让我的代码简单易读……这就是我所关心的 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 2017-06-12
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多