2009-01-20 76 views
4

我注意到有时用户输错他们的电子邮件地址(在联系人 - 我们的表单中),例如,输入@ yahho.com,@ yhoo.com或@ yahoo.co而不是@yahoo。 com在javascript中检测错误的电子邮件地址

我觉得这可以通过一些JavaScript现场更正。只需检查电子邮件地址以查找可能出现的错误(如上面列出的错误),以便如果用户键入[email protected],则可以显示非突出显示的消息或类似消息,这表明他可能表示@yahoo。 com,并要求仔细检查他是否正确输入了他的电子邮件。

的问题是:
如何检测-in的Java脚本 - 一个字符串是非常相似的“雅虎”或“yahoo.com”?或者一般情况下,我如何检测两个字符串之间的相似程度?

P.S. (这是一个侧面说明)在我的具体情况下,用户不是英语为母语的人,他们中的大多数人没有接近流利的地方,该网站本身不是英语。

回答

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 = '[email protected]'; 
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

使用正则表达式可能是可能的,但个人而言,编写一个会花费我太多时间,我会很高兴能够得到所有可能的排列而不会造成太多的误报。

所以,这里是我会做什么:

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

是的,这不是很漂亮,但它似乎(至少从你的问题),就像你会有很多检查,所以它应该执行得很好。它似乎(至少在我看来)是值得花费大量时间的东西,所以这是一个难以置信的简单解决方案,可以在15-30分钟内完成。

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"?

+0

似乎有点过度“联系我们的形式”,不是吗? – 2009-01-20 03:57:24

+0

@Daniel,一个简单的soundex函数可以在少于20行的代码中完成。但是,最“全部”的东西是“联系我们”的形式。 :) – Stefan 2009-01-20 04:01:29

+0

嗯,我想这是在告诉我所有的“联系我们”表格都是mailto:links ... – 2009-01-20 04:05:56

6

除了同音,你可能还需要看看算法确定Levenshtein距离。

+0

似乎Levenshtein就是我所追求的! – hasen 2009-01-20 04:11:03

1

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

0

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

有一个很棒的Javascript库,它完全符合你的要求:Mailcheck来自Kicksend。

https://github.com/DimitarChristoff/mailcheck

库:

  • 提供高达域和顶级域的建议。
  • 可以自定义(域名,顶级域名,字符串距离法)。
  • 可以与jQuery
  • 被用于从jQuery的

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

相关问题