PHPでメールアドレスを検証する方法

224
Cameron 2012-08-20 03:29.

私は電子メールアドレスを検証するためにこの機能を持っています:

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

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

メールアドレスが有効かどうか確認しても大丈夫ですか?

11 answers

591
PeeHaa 2012-08-20 03:32.

電子メールアドレスが整形式であるかどうかを確認する最も簡単で安全な方法は、次の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ソースを参照してください。

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

  • rfc5322
  • rfc5321
  • rfc3696
  • rfc6531(多くのクライアント/サーバーはそれを受け入れませんが、ユニコード文字を許可します)

filter_var()すでに述べたように、PHP5.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 = '[email protected]';

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

PS上記で使用された正規表現パターンに関する注記(PHPソースから)。MichaelRushtonの著作権があるようです。述べられているように:「このコードを自由に使用して再配布してください。ただし、この著作権表示を保持してください。」

45
Cameron Martin 2012-08-20 03:33.

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

<?php
   function validateEmail($email) {
      return filter_var($email, FILTER_VALIDATE_EMAIL);
   }
?>
15
Jabari 2017-02-04 21:03.

私の経験では、regexソリューションには誤検知が多すぎ、filter_var()ソリューションには誤検知があります(特にすべての新しいTLDの場合)。

代わりに、アドレスに電子メールアドレスの必要な部分(ユーザー、「@」記号、ドメイン)がすべて含まれていることを確認してから、ドメイン自体が存在することを確認することをお勧めします。

電子メールユーザーが外部ドメインに存在するかどうかを(サーバー側で)判断する方法はありません。

これは、Utilityクラスで作成したメソッドです。

public static function validateEmail($email)
{
    // SET INITIAL RETURN VARIABLES

        $emailIsValid = FALSE;

    // MAKE SURE AN EMPTY STRING WASN'T PASSED

        if (!empty($email))
        {
            // GET EMAIL PARTS

                $domain = ltrim(stristr($email, '@'), '@') . '.';
                $user   = stristr($email, '@', TRUE);

            // VALIDATE EMAIL ADDRESS

                if
                (
                    !empty($user) &&
                    !empty($domain) &&
                    checkdnsrr($domain)
                )
                {$emailIsValid = TRUE;}
        }

    // RETURN RESULT

        return $emailIsValid;
}
11
Fluffeh 2012-08-20 03:32.

PHPの組み込みフィルターを使用したほうがよいと思います-この特定のケースでは:

FILTER_VALIDATE_EMAILparamを指定すると、trueまたはfalseを返すことができます。

9
Excalibur 2017-03-23 21:26.

これにより、電子メールが検証されるだけでなく、予期しない文字がないかサニタイズされます。

$email  = $_POST['email'];
$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);

if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false ||
    $emailB != $email
) {
    echo "This email adress isn't valid!";
    exit(0);
}
4
FlameStorm 2016-12-14 10:21.

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

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

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

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

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

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

3
Bud Damyanov 2018-05-02 22:44.

メールアドレスから提供されたドメインが有効かどうかを確認したい場合は、次のようなものを使用してください。

/*
* Check for valid MX record for given email domain
*/
if(!function_exists('check_email_domain')){
    function check_email_domain($email) {
        //Get host name from email and check if it is valid
        $email_host = explode("@", $email);     
        //Add a dot to the end of the host name to make a fully qualified domain name and get last array element because an escaped @ is allowed in the local part (RFC 5322)
        $host = end($email_host) . "."; 
        //Convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
        return checkdnsrr(idn_to_ascii($host), "MX"); //(bool)       
    }
}

有効な電子メール形式は有効な電子メールを意味しないため、これは、標準の電子メール検証とともに、多くの無効な電子メールアドレスをフィルタリングするための便利な方法です。

idn_to_ascii()(または彼の姉妹関数idn_to_utf8())関数PHPインストールで使用できない場合があることに注意してください。これには、拡張機能PECL intl> = 1.0.2およびPECLidn> = 0.1が必要です。

また、電子メールのドメイン部分としてのIPv4またはIPv6(たとえば[email protected][IPv6:2001:db8::1])は検証できず、名前付きホストのみが検証できることに注意してください。

詳しくはこちらをご覧ください

3
Pelmered 2019-04-26 22:46.

ここで答えを読んだ後、これは私が最終的に得たものです:

public static function isValidEmail(string $email) : bool
{
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return false;
    }

    //Get host name from email and check if it is valid
    $email_host = array_slice(explode("@", $email), -1)[0];

    // Check if valid IP (v4 or v6). If it is we can't do a DNS lookup
    if (!filter_var($email_host,FILTER_VALIDATE_IP, [
        'flags' => FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE,
    ])) {
        //Add a dot to the end of the host name to make a fully qualified domain name
        // and get last array element because an escaped @ is allowed in the local part (RFC 5322)
        // Then convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
        $email_host = idn_to_ascii($email_host.'.');

        //Check for MX pointers in DNS (if there are no MX pointers the domain cannot receive emails)
        if (!checkdnsrr($email_host, "MX")) {
            return false;
        }
    }

    return true;
}
1
smulholland2 2016-12-29 08:19.

さまざまなドット、アンダースコア、ダッシュを使用できる実際の正規表現を探している場合は、次のようになります[a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+。これにより、かなりばかげた外観の電子メール[email protected]_matrix.comを検証できるようになります。

0
Thielicious 2017-08-15 02:32.
/(?![[:alnum:]]|@|-|_|\.)./

現在、HTML5フォームを使用する場合type=email、ブラウザーエンジンには独自のバリデーターがあるため、すでに80%安全です。それを補完するには、この正規表現をに追加してpreg_match_all()無効にします。

if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }

検証のためにHTML5フォームで使用される正規表現を見つける
https://regex101.com/r/mPEKmy/1

0
Mostafa Norzade 2020-10-03 07:09.

以下のコードを使用してください。

// Variable to check
$email = "[email protected]";

// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

// Validate e-mail
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
  echo("Email is a valid email address");
} else {
  echo("Oppps! Email is not a valid email address");
}

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

2021 年 6 月 8 日にニューヨーク市で開催された covid-19 パンデミックで亡くなった人々の命を偲び、祝うために、ネーミング ザ ロスト メモリアルズが主催するイベントと行進の最中に、グリーンウッド墓地の正門から記念碑がぶら下がっています。週末、ジョー・バイデン大統領は、covid-19 パンデミックの終息を宣言しました。これは、過去 2 年以上にわたり、公の場でそうするための長い列の中で最新のものです。

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

オハイオ州のエミリー・デシャネル みんな早く来て、ボーンズが帰ってきた!まあ、ショーボーンズではなく、彼女を演じた俳優. エミリー・デシャネルに最後に会ってからしばらく経ちました.Emily Deschanel は、長期にわたるプロシージャルな Bones の Temperance “Bones” Brennan としてよく知られています。

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

どうやら、ドナルド・トランプに近い人々は、今月初めにFBIによって家宅捜索された彼のMar-a-Lago財産からの映像を公開するよう彼に勧めています. 前大統領はテープを公開するかどうかを確認していませんが、息子はフォックス・ニュースにそうなるだろうと語った.

Andor は、他の Star Wars ショーから大きな距離を置きます。

Andor は、他の Star Wars ショーから大きな距離を置きます。

アンドールの一場面。数十年前、ジョージ・ルーカスがスター・ウォーズのテレビ番組を制作するのを妨げた主な理由は、お金でした。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language