我注意到有时用户会错误输入他们的电子邮件地址(以联系我们的形式),例如,键入@ yahho.com,@ yhoo.com或@ yahoo.co而不是@ yahoo.com
我觉得这可以通过一些javascript在现场纠正。只需检查电子邮件地址是否存在可能的错误,例如上面列出的错误,这样如果用户键入his_email@yhoo.com,就会显示非突兀的消息,或类似的消息,表明他可能意味着@yahoo。 com,并要求仔细检查他是否正确输入了他的电子邮件。
问题是:
如何在java脚本中检测到字符串与“yahoo”或“yahoo.com”非常相似?或者一般来说,我如何检测两个字符串之间的相似程度?
P.S。 (这是旁注)在我的具体案例中,用户不是以英语为母语的人,而且大部分用户都不是那么流利,网站本身不是英文。
答案 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?
答案 3 :(得分:1)
当然,作为第一步,您可以删除域名并进行DNS查找 - 至少应该告诉您它是否合法。
答案 4 :(得分:0)
正如其他人所说,Levenshtein distance是一个可靠的解决方案。
有一个出色的Javascript库可以完全满足您的需求:来自Kicksend的Mailcheck。
https://github.com/DimitarChristoff/mailcheck
图书馆:
此库使用sift3字符串相似度算法来提高速度。据报道,Levenshtein距离产生更好的结果(https://github.com/DimitarChristoff/mailcheck)。
答案 5 :(得分:-1)
也许有可能使用正则表达式,但就个人而言,写一个我会满意的可能会花费太长时间,这可能会得到所有可能的排列而不会导致太多的误报。
所以,这就是我要做的事情:
是的,它不是很漂亮,但它似乎(至少从你的问题)看起来不像你要检查那么多,所以它应该表现得很好。它似乎(至少对我来说)不值得投入大量时间,所以这是一个令人难以置信的简单解决方案,可以在大约15-30分钟内完成。