263

メールアドレスを検証するこの機能があります:

function validateEMAIL($EMAIL) {
    $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";

    return (bool)preg_match($v, $EMAIL);
}

メールアドレスが正しいかどうかを確認するのにこれでいいですか?

4

12 に答える 12

656

メールアドレスが整形式かどうかを確認する最も簡単で安全な方法は、次のfilter_var()関数を使用することです。

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // invalid emailaddress
}

MXさらに、ドメインがレコードを定義しているかどうかを確認できます。

if (!checkdnsrr($domain, 'MX')) {
    // domain is not valid
}

しかし、これはメールが存在することを保証するものではありません。それを確認する唯一の方法は、確認メールを送信することです。


簡単な答えが得られたので、学習したい場合、または簡単な答えを使用して次に進む場合は、メールアドレスの検証について自由に読んでください. 何恨みっこない。

正規表現を使用して電子メール アドレスを検証しようとするのは「不可能」な作業です。あなたが作成した正規表現は役に立たないとまで言います。メールアドレスに関する 3 つの RFC があり、正規表現を作成して間違ったメールアドレスをキャッチし、同時に誤検知を避けることは、人間にはできないことです。PHP の関数で使用される正規表現のテスト (失敗と成功の両方) については、このリストを確認してください。filter_var()

組み込みの PHP 関数、電子メール クライアント、またはサーバーでさえ、正しく動作しません。それでも、ほとんどの場合filter_var、これが最適なオプションです。

PHP が (現在) 電子メール アドレスを検証するために使用している正規表現パターンを知りたい場合は、PHP ソースを参照してください。

メールアドレスについて詳しく知りたい場合は、仕様を読み始めることをお勧めしますが、簡単に読めるものではないことを警告しておきます。

filter_var()すでに述べたように、PHP 5.2 以降でのみ利用可能であることに注意してください。以前のバージョンの PHP で動作させたい場合は、PHP で使用されている正規表現を使用できます。

<?php

$pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';

$emailaddress = 'test@gmail.com';

if (preg_match($pattern, $emailaddress) === 1) {
    // emailaddress is valid
}

PS上記で使用された正規表現パターンに関するメモ(PHPソースから)。Michael Rushtonの著作権があるようです。「このコードは自由に使用および再配布してください。ただし、この著作権表示は保管しておいてください。」

于 2012-08-19T13:32:14.213 に答える
53

これにはfilter_varを使用できます。

<?php
   function validateEmail($email) {
      return filter_var($email, FILTER_VALIDATE_EMAIL);
   }
?>
于 2012-08-19T13:33:15.257 に答える
12

PHP の組み込みフィルターを使用したほうがよいと思います。この場合は次のようになります。

FILTER_VALIDATE_EMAILパラメータを指定すると、true または false を返すことができます。

于 2012-08-19T13:32:43.840 に答える
5

メール検証に関する「トップの質問」でこれに回答しましたhttps://stackoverflow.com/a/41129750/1848217

私にとって、メールをチェックする正しい方法は次のとおりです。

  1. 記号 @ が存在し、その前後に @ 以外の記号があることを確認します。/^[^@]+@[^@]+$/
  2. 「アクティベーション コード」を記載したメールをこのアドレスに送信してみてください。
  3. ユーザーが自分のメールアドレスを「有効化」すると、すべてが正しいことがわかります。

もちろん、ユーザーが「奇妙な」メールを入力したときにフロントエンドに警告またはツールチップを表示して、ドメイン部分にドットがない、引用符なしで名前にスペースがあるなどのよくある間違いを避けることができます。ただし、ユーザーが本当に必要とする場合は、アドレス「hello@world」を受け入れる必要があります。

また、電子メール アドレスの標準は進化しており、進化する可能性があることを覚えておく必要があります。そのため、「標準で有効な」正規表現を一度だけ入力することはできません。また、一部の具体的なインターネット サーバーは、一般的な標準の一部の詳細に失敗し、実際には独自の「変更された標準」で動作する可能性があることを覚えておく必要があります。

したがって、@ をチェックし、フロントエンドでユーザーにヒントを与え、指定されたアドレスに確認メールを送信するだけです。

于 2016-12-13T20:21:57.107 に答える