繁体   English   中英

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

[英]detecting mistyped email addresses in javascript

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

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

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

PS(这是旁注)在我的具体情况下,用户不是以英语为母语的人,而且大多数人都不会说得那么流利,网站本身也不是英文。

这是一个脏实现,可以使用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] + '?');
    }
}

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

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

SQL Server的非拉丁字符集上的SoundEx函数?

soundex算法的数据结构?

你如何实现“你的意思”?

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

正如其他人所说, Levenshtein距离是一个肯定的解决方案。

有一位优秀的JavaScript库,不正是你想要什么: MAILCHECK从Kicksend。

https://github.com/DimitarChristoff/mailcheck

图书馆:

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

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

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

所以,这就是我要做的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM