在javascript中检测错误的电子邮件地址

has*_*sen 5 javascript email-validation

我注意到有时候用户错误输入他们的电子邮件地址(以联系我们的形式),例如,键入@ yahho.com,@ yhoo.com或@ yahoo.co而不是@ yahoo.com

我觉得这可以通过一些javascript在现场纠正.只需检查电子邮件地址是否存在可能的错误,例如上面列出的错误,这样如果用户键入his_email@yhoo.com,就会显示非突兀的消息,或类似的消息,表明他可能意味着@yahoo. com,并要求仔细检查他是否正确输入了他的电子邮件.

问题是:
如何检测-in java脚本 - 字符串与"yahoo"或"yahoo.com"非常相似?或者一般来说,我如何检测两个字符串之间的相似程度?

PS(这是旁注)在我的具体案例中,用户不是以英语为母语的人,而且大部分用户都不熟悉,网站本身不是英文.

Pao*_*ino 10

这是一个脏实现,可以使用它来进行一些简单的检查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] + '?');
    }
}
Run Code Online (Sandbox Code Playgroud)


Abi*_*bie 6

除了soundex之外,您可能还想了解用于确定Levenshtein距离的算法.