在javascript中检测错误的电子邮件地址

时间:2009-01-20 03:44:41

标签: javascript email-validation

我注意到有时用户会错误输入他们的电子邮件地址(以联系我们的形式),例如,键入@ yahho.com,@ yhoo.com或@ yahoo.co而不是@ yahoo.com

我觉得这可以通过一些javascript在现场纠正。只需检查电子邮件地址是否存在可能的错误,例如上面列出的错误,这样如果用户键入his_email@yhoo.com,就会显示非突兀的消息,或类似的消息,表明他可能意味着@yahoo。 com,并要求仔细检查他是否正确输入了他的电子邮件。

问题是:
如何在java脚本中检测到字符串与“yahoo”或“yahoo.com”非常相似?或者一般来说,我如何检测两个字符串之间的相似程度?

P.S。 (这是旁注)在我的具体案例中,用户不是以英语为母语的人,而且大部分用户都不是那么流利,网站本身不是英文。

6 个答案:

答案 0 :(得分:9)

这是一个脏实现,可以使用Levenshtein distance进行一些简单的检查。 “levenshteinenator”的归功于this link。你可以将你想要的任何流行域添加到域数组中,它会检查输入的电子邮件的主机部分的距离是1还是2,这可以合理地接近假设某处有拼写错误。

levenshteinenator = function(a, b) {
    var cost;

    // get values
    var m = a.length;
    var n = b.length;

    // make sure a.length >= b.length to use O(min(n,m)) space, whatever that is
    if (m < n) {
        var c=a;a=b;b=c;
        var o=m;m=n;n=o;
    }

    var r = new Array();
    r[0] = new Array();
    for (var c = 0; c < n+1; c++) {
        r[0][c] = c;
    }

    for (var i = 1; i < m+1; i++) {
        r[i] = new Array();
        r[i][0] = i;
        for (var j = 1; j < n+1; j++) {
            cost = (a.charAt(i-1) == b.charAt(j-1))? 0: 1;
            r[i][j] = minimator(r[i-1][j]+1,r[i][j-1]+1,r[i-1][j-1]+cost);
        }
    }

    return r[m][n];
}

// return the smallest of the three values passed in
minimator = function(x,y,z) {
    if (x < y && x < z) return x;
    if (y < x && y < z) return y;
    return z;
}

var domains = new Array('yahoo.com','google.com','hotmail.com');
var email = 'whatever@yahoo.om';
var parts = email.split('@');
var dist;
for(var x=0; x < domains.length; x++) {
    dist = levenshteinenator(domains[x], parts[1]);
    if(dist == 1 || dist == 2) {
        alert('did you mean ' + domains[x] + '?');
    }
}

答案 1 :(得分:6)

除了soundex之外,您可能还想查看用于确定Levenshtein距离的算法。

答案 2 :(得分:2)

查看soundex和差异: 如果您使用ajax,您可以让sql-server检查单词的soundex值对“正确”的域并获得建议。也可以制作一个自己的soundex版本(它并不复杂)。

SQL Server's SoundEx function on non-Latin character sets?

Data structure for soundex algorithm?

How do you implement a "Did you mean"?

答案 3 :(得分:1)

当然,作为第一步,您可以删除域名并进行DNS查找 - 至少应该告诉您它是否合法。

答案 4 :(得分:0)

正如其他人所说,Levenshtein distance是一个可靠的解决方案。

有一个出色的Javascript库可以完全满足您的需求:来自Kicksend的Mailcheck

https://github.com/DimitarChristoff/mailcheck

图书馆:

  • 为域名和顶级域名提供建议。
  • 可以自定义(域名,顶级域名,字符串距离法)。
  • 可以与jQuery一起使用
  • 与jQuery分离

此库使用sift3字符串相似度算法来提高速度。据报道,Levenshtein距离产生更好的结果(https://github.com/DimitarChristoff/mailcheck)。

答案 5 :(得分:-1)

也许有可能使用正则表达式,但就个人而言,写一个我会满意的可能会花费太长时间,这可能会得到所有可能的排列而不会导致太多的误报。

所以,这就是我要做的事情:

  • 硬编码所有常见输入错误的列表。
  • 使用不区分大小写的字符串比较来将电子邮件与列表中的每个字符串进行比较。
  • 如果匹配,则显示警告 - “您的意思是yahoo.com吗?”

是的,它不是很漂亮,但它似乎(至少从你的问题)看起来不像你要检查那么多,所以它应该表现得很好。它似乎(至少对我来说)不值得投入大量时间,所以这是一个令人难以置信的简单解决方案,可以在大约15-30分钟内完成。