2009-01-20 49 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)。

相關問題