我注意到有时候用户错误输入他们的电子邮件地址(以联系我们的形式),例如,键入@ yahho.com,@ yhoo.com或@ yahoo.co而不是@ yahoo.com
我觉得这可以通过一些javascript在现场纠正.只需检查电子邮件地址是否存在可能的错误,例如上面列出的错误,这样如果用户键入his_email@yhoo.com,就会显示非突兀的消息,或类似的消息,表明他可能意味着@yahoo. com,并要求仔细检查他是否正确输入了他的电子邮件.
问题是:
如何检测-in 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距离的算法.