質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

6回答

9210閲覧

PHPで正規表現でmailを取り扱いたい

sasakichiaki

総合スコア8

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

2クリップ

投稿2017/09/25 02:06

###前提・実現したいこと
現在PHPで正規表現を学んでいます。そこで、メールアドレスをcheckするpreg_matchを考えているのですが、こちらの内容で対応できているか確認したいです。

preg_match('/^([a-z0-9+-]+)(.[a-z0-9+-]+)*@([a-z0-9-]+.)+[a-z]{2,6}$/iD', $mail)

/対象文字は、アルファベットと数字、_とハイフン
/.は一番初めにしないように追加で設定※繰り返しは可能
/@は1回
/最後の文字は絶対にアルファベットで2文字~6文字の間
/最後に悪質なコードを不可にするためにDのオプション設定

できれば、他にどんな書き方があるのか、知りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

正規表現でEメールアドレスバリデーションというジャンルは、一流プログラマの間でもたびたび話題・ネタになるほどの非常に奥深い処理、平たく言えば「地雷」です。

特にPHP初級者が不完全な正規表現でメールアドレスのバリデーションをしている姿がしばしばバカにされるほどです。

PHPには**検証フィルタ機能でさくっとチェックができる**ので、これを使うのが無難だと思います。(これでも完璧なチェックは難しいと言われています)

php

1filter_var('hoge@example.com', FILTER_VALIDATE_EMAIL);

もちろん文字列のチェックだけではそのメールアドレスが有効かどうかの判定はできないので、最終的には様々なサイトがやっているように、実際に確認メールを送ってそこの認証用URLにアクセスさせるといった段取りが必要になってきます。

もう少し丁寧な実装では、確認メール送信前にドメインの有効性をチェックをする場合もあるようです。

投稿2017/09/25 02:29

編集2017/09/25 04:20
miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

showkit

2017/09/25 02:31

勉強になりました。
guest

0

厳密にメールアドレスを考えるなら、

  • #?${}%といった記号は問題なく使える
  • @の左側を二重引用符で囲ってしまえば、ASCIIの記号はすべて通る
  • 日本語などの国際化ドメイン
  • @[192.0.2.0]のようなIPアドレス指定のドメインパート

など、予想もつかないようなものが「正しい」として通ってしまいます。正直言って、厳密にチェックするのは、専門のライブラリでも難しいぐらいです。

そろそろメールアドレスを正規表現だけでチェックするのは終わりにしませんか?

投稿2017/09/25 02:35

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何のためにチェックするのか?ってところに問題は集約されるのですが、ざっくりとした検証がしたい!って程度なら、filter_var($email, FILTER_VALIDATE_EMAIL);程度で良いと思います。

そろそろメールアドレスを正規表現だけでチェックするのは終わりにしませんか?

コメント欄も含めて、上記は面白いので読んでみると良いと思います。

ちなみに、下手な正規表現で確認しようとすると、それ自体が DoS 攻撃の対象となるので注意が必要です。

投稿2017/09/25 02:37

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この問題には多くの先人たちが取り組んでいますので、ありがたくその成果を使わせていただくのがいいでしょう。たとえば
メールアドレスを表す現実的な正規表現

厳密に判定しようとすると、とんでもなく複雑な正規表現が必要になるようです。
99%のEmailアドレスにマッチする正規表現公開される

投稿2017/09/25 02:32

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

正規表現で行うべきものではなく、filter_input(INPUT_POST, 'email') で良いのでは。

【PHP: filter_input - Manual】
http://php.net/manual/ja/function.filter-input.php

【PHPで各種バリデーション - Qiita】
http://qiita.com/mpyw/items/346f1789ad0e1b969ebc

【PHPしか書けないザコがメールアドレス正規表現でガチ勢に挑んでみた - Qiita】
http://qiita.com/mpyw/items/257eabe0b43b1e02e6f7

投稿2017/09/25 02:36

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

確かメールアドレスは RFC(細かく読んでいませんが) では 大文字・小文字どちらでも可能なはずですので、わたしは

php

1preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $value);

で、チェックしています。
RFC ではドメイン名は 大文字・小文字区別なしで メールアドレスは区別ありでしたか?
(詳しい方、教えてください)
ウィキペディアでは「実際には区別されていない実装がほとんどである。一般的には小文字で表記される」と書かれていますね。

投稿2017/09/25 02:22

showkit

総合スコア1638

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問