6

ユーザーが自分のメール アドレスを (お問い合わせフォームで) 間違って入力することがあります。

これはJavaScriptでその場で修正できると思います。ユーザーが his_email@yhoo.com と入力すると、目立たないメッセージが表示されるか、おそらく @yahoo を意味することを示唆するようなメッセージが表示されます。 com にアクセスし、電子メールを正しく入力したことを再確認するように求めました。

問題は
、文字列が「yahoo」または「yahoo.com」に非常に似ていることを Java スクリプトで検出するにはどうすればよいかということです。または一般的に、2 つの文字列間の類似性のレベルをどのように検出できますか?

PS (これは補足説明です) 私の特定のケースでは、ユーザーはネイティブの英語話者ではなく、ほとんどのユーザーは流暢に話せません。サイト自体は英語ではありません。

4

6 に答える 6

11

これは、を使用していくつかの簡単なチェックを取得できるダーティな実装です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] + '?');
    }
}
于 2009-01-20T04:03:09.050 に答える
6

soundex に加えて、レーベンシュタイン距離を決定するためのアルゴリズムも調べたいと思うかもしれません。

于 2009-01-20T03:54:15.153 に答える
2

soundex と Difference をチェックしてください: ajax を使用している場合は、SQL サーバーに「正しい」ドメインに対する単語の soundex-value をチェックさせ、提案を返すことができます。独自のバージョンの soundex を作成することもできます (それほど複雑ではありません)。

非ラテン文字セットでの SQL Server の SoundEx 関数?

soundexアルゴリズムのデータ構造?

「もしかして」をどのように実装しますか?

于 2009-01-20T03:52:40.023 に答える
1

もちろん、最初のステップとして、ドメイン名を削除して DNS ルックアップを実行することもできます。これにより、少なくともそれが正当であるかどうかがわかります。

于 2009-01-20T03:56:51.107 に答える
0

他の人が言ったように、レーベンシュタイン距離は確実な解決策です。

あなたが望むことを正確に行う優れたJavascriptライブラリがあります:KicksendのMailcheck.

https://github.com/DimitarChristoff/mailcheck

図書館:

  • ドメインとトップ レベル ドメインの提案を提供します。
  • カスタマイズ可能(ドメイン、トップドメイン、文字列距離法)。
  • jQueryで使える
  • jQueryから分離されています

このライブラリは、高速化のためにsift3文字列類似性アルゴリズムを使用しています。レーベンシュタイン距離の方が良い結果が得られることが報告されています ( https://github.com/DimitarChristoff/mailcheck )。

于 2014-03-31T18:32:59.647 に答える
-1

正規表現を使用することは可能かもしれませんが、個人的には、あまりにも多くの誤検知を引き起こすことなく、すべての可能な順列を取得できる満足できる正規表現を書くには時間がかかりすぎます。

だから、これが私がすることです:

  • すべての一般的な入力エラーのリストをハードコーディングします。
  • 大文字と小文字を区別しない文字列比較を使用して、電子メールをリスト内の各文字列と比較します。
  • 一致する場合は、「yahoo.com のことですか?」という警告を表示します。

ええ、それはあまりきれいではありませんが、(少なくともあなたの質問からは)チェックする必要があるようには見えないので、うまく機能するはずです。また、(少なくとも私には)多くの時間を費やす価値があるとは思えないため、これは約15〜30分で実行できる信じられないほど簡単なソリューションです.

于 2009-01-20T03:52:33.503 に答える