3

電子メールアドレスを検証するために使用できる多くの正規表現がありますが、それらのほとんどは非ASCII文字と互換性がありません。メールアドレスに「Rδοκιμή@παράδειγμα.δοκιμή」や「管理员@中国互联ر络信息中心.中国」などの非ASCII文字が含まれていると、正しく認識できません。電子メールアドレスの検証に使用され、非ASCII文字と互換性のある正規表現を作成するにはどうすればよいですか?

4

3 に答える 3

5

このソースによると、正規表現クラスを介してUnicodeサポートを提供しないJavaScriptは、文字列構文の一部として単一のUnicodeコードポイントを照合するための\uFFFFをサポートします。
したがって、Unicode文字の一致を定義するには、一連の\uXXXX記号を作成する必要があります。ここにリストされているプラ​​グインは、Unicode正規表現の作成を可能にし、 XRegExpJavaScriptライブラリを使用しながらUnicode正規表現を定義するために使用できます。

有効なASCII電子メールアドレスをテストする関数は次のとおりです。

/**
 * Checks if string contains valid email address as described
 * in RFC 2822: http://tools.ietf.org/html/rfc2822#section-3.4.1
 * This function omits the syntax using double quotes and square brackets
 * @return {Boolean}    True, if test succeeded.
 */
String.prototype.checkEmail = function()
{
    var reEmail = /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
    return reEmail.test(this);
}

// Usage example
alert( "some_valid_email@somewhere.com".checkEmail() ); // true
alert( "invalid_email.com".checkEmail() ); // false

Unicode文字列で機能させるために、XRegExpライブラリを含めて、\\p{L}の代わりに使用することができますa-z。完全なコードは次のとおりです。

<!DOCTYPE html>
<html>
<head>
    <script src="xregexp-all-min.js"></script>
    <script>
        /**
         * Checks if string contains valid email address as described
         * in RFC 2822: http://tools.ietf.org/html/rfc2822#section-3.4.1
         * This function omits the syntax using double quotes and square brackets
         * @return {Boolean}    True, if test succeeded.
         */
        String.prototype.checkEmailX = function()
        {
            var reEmail = XRegExp("^[\\p{L}0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[\\p{L}0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?\.)+[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?$");
            return reEmail.test(this);
        }

        alert( "true = " + "Rδοκιμή@παράδειγμα.δοκιμή".checkEmailX() ); // true
        alert( "true = " +"管理员@中国互联网络信息中心.中国".checkEmailX() ); // true
        alert( "true = " +"test@test.am".checkEmailX() ); // true
        alert( "false = " +"test_test.am".checkEmailX() ); // false
        alert( "true = " +"test@ράδ.am".checkEmailX() ); // true
    </script>
</head>
<body>
</body>
</html>
于 2012-10-21T18:24:05.627 に答える
4

物事を複雑にしすぎないでください。

少し時間を取って、なぜそれが必要なのか考えてください。ユーザーにメールを送信したいからでしょう。だから私はそこにある最も簡単な電子メール検証正規表現を提唱したいと思います:

/@/

終わり。有効なすべてのメールアドレスを検証します。また、1つのように見えても実際には有効ではない多くのものを誤って検証しますが、ほとんどのエラーは、フォームフィールドに入力されていないか、フィールドを混乱させ、他のフィールドに間違ったものを入力しています。

また、メールがバウンスするためにメールアドレスが無効であるかどうかもわかります。そして、アドレスの存在は、正規表現では不可能なことです。

于 2012-10-21T18:27:42.597 に答える
4

正規表現を使用してメールアドレスを検証する方法についての記事を書く必要がありました。残念ながら、結果として、この方法で電子メールアドレスを検証することはできません

もちろん、その理由を知りたいと思います。

  1. ウィキペディアの記事で有効なメールアドレスの例を見てください。これらの基準をすべて満たす正規表現を作成することはほぼ不可能です。
  2. 確かに、ネイティブのトップレベルドメインについてはすでに知っています。それがあなたの質問の理由です。ただし、「標準」の国内TLDとは別に、ここではほぼすべての名前が付けられていることに気付いていないかもしれません。そしてそれは動く標的なので...
  3. すべてのドメインレジストリが従う特定のポリシーはありません。たとえば、日本のレジストリでは、ラベルの区切り文字として表意文字の終止符(全角と全角の両方)を使用できることがわかりました。それがどのように機能するかはわかりませんが、それは彼らが許可していることです。また、ラベルの最大長には、日本と中国のレジストリに違いがあることがわかりました。正規表現でどのように検証できるかわかりません。

では、どうすれば電子メールを検証できますか?1つのアイデアは、特定のドメインのMTAが存在するかどうかを単純に尋ねることです(これは、クライアント側のJavaScriptを使用しているフロントエンド側では実行できませんでした)。残念ながら、それはDOS攻撃のリスクをもたらすため、最高のアイデアである必要はありません。そしてもちろん、そのアドレスが特定のサーバーで有効かどうかはわかりません。そのためには、サーバーに接続してVRFYコマンドを発行する必要がありますが、スパマーのおかげで、ほとんどのサーバーは「550Nosuchuser」と応答します。

検証の目的がユーザーのミスを回避することだけである場合は、フィールドを追加して、ユーザーに電子メールを再入力させることをお勧めします(これも最善の方法ではありません)。

于 2012-10-21T20:07:16.367 に答える