[英]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版本(它并不复杂)。
当然,作为第一步,您可以删除域名并进行DNS查找 - 至少应该告诉您它是否合法。
正如其他人所说, Levenshtein距离是一个肯定的解决方案。
有一位优秀的JavaScript库,不正是你想要什么: MAILCHECK从Kicksend。
https://github.com/DimitarChristoff/mailcheck
图书馆:
该库使用sift3字符串相似度算法来实现速度目的。 据报道,Levenshtein距离产生更好的结果( https://github.com/DimitarChristoff/mailcheck )。
也许可以使用正则表达式,但就个人而言,写一个我会满意的时间会花费太多时间,这可能会得到所有可能的排列而不会导致太多的误报。
所以,这就是我要做的:
是的,它不是很漂亮,但它似乎(至少从你的问题)似乎没有那么多要检查,所以它应该表现得很好。 它似乎(至少对我来说)不值得投入大量时间,所以这是一个令人难以置信的简单解决方案,可以在大约15-30分钟内完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.