正規表現を使用してメールアドレスを検証するにはどうすればよいですか? 質問する

正規表現を使用してメールアドレスを検証するにはどうすればよいですか? 質問する

私は何年もかけてゆっくりと正規表現サーバー部分に IP アドレスを使用していないと仮定すると、ほとんどの電子メール アドレスを正しく検証します。

私はいくつかのPHPプログラムでこれを使用しており、ほとんどの場合うまく動作します。しかし、時々、これを使用しているサイトで問題を抱えている人から連絡があり、調整が必要になることがあります(最近、4文字のTLD)。

電子メールを検証するための最適な正規表現は何ですか、または見たことがありますか?

複数の短い式を使用する関数を使用するソリューションをいくつか見てきましたが、より複雑な関数で複数の短い式を使用するよりも、単純な関数で 1 つの長くて複雑な式を使用する方がよいでしょう。

ベストアンサー1

RFC 822に完全準拠した正規表現長すぎるため非効率的でわかりにくい。幸い、RFC 822は2度置き換えられ、現在の電子メールアドレスの仕様はRFC 5322RFC 5322 は、数分間勉強すれば理解でき、実際の使用に十分効率的な正規表現をもたらします。

RFC 5322に準拠した正規表現の1つは、ページ上部にあります。http://emailregex.com/しかし、インターネット上で出回っている IP アドレス パターンを使用していますが、00ドット区切りのアドレスに任意の符号なしバイト 10 進数値を許可するバグがあり、これは違法です。残りの部分は RFC 5322 の文法と一致しているようで、grep -Poドメイン名、IP アドレス、不正な IP アドレス、引用符付きまたは引用符なしのアカウント名など、 を使用したいくつかのテストに合格しています。

00IP パターンのバグを修正すると、機能的でかなり高速な正規表現が得られます。(実際のコードについては、マークダウンではなくレンダリングされたバージョンをスクレイピングしてください。)

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z 0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

または:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

ここは有限状態機械上記の正規表現は正規表現自体よりも明確であるここに画像の説明を入力してください

PerlやPCRE(PHPなどで使われる正規表現ライブラリ)のより洗練されたパターンは、RFC 5322を問題なく正しく解析するPython と C# でも同じことができますが、最初の 2 つとは異なる構文を使用します。ただし、それほど強力ではないパターン マッチング言語のいずれかを使用する必要がある場合は、実際のパーサーを使用することをお勧めします。

また、RFC に従って検証しても、そのアドレスが指定されたドメインに実際に存在するかどうか、またはアドレスを入力した人がそのアドレスの真の所有者であるかどうかについてはまったく何もわからないことを理解しておくことも重要です。人々は常にこの方法で他の人をメーリング リストに登録しています。これを修正するには、より高度な種類の検証が必要であり、そのアドレスに、アドレスと同じ Web ページで入力することを意図した確認トークンを含むメッセージを送信する必要があります。

確認トークンは、入力した人のアドレスを取得したことを確認する唯一の方法です。これが、現在ほとんどのメーリング リストがサインアップの確認にこのメカニズムを使用している理由です。結局のところ、誰でも を入力することができ[email protected]、それが合法であると解析されますが、相手が本人である可能性は低いのです。

PHPの場合、以下のパターンは使用しないでください。PHP で電子メール アドレスを正しく検証するそこから引用します:

一般的な使用法と広範囲にわたるずさんなコーディングにより、記録された正式な標準よりも制限の厳しい電子メール アドレスの事実上の標準が確立される危険性があります。

これは他の非RFCパターンと比べても劣ります。RFC 822RFC 5322 は言うまでもありません。これですしかしながら、そうです。

凝ったことをしたいなら、完全な状態エンジンを実装する正規表現は基本的なフィルタとしてしか機能しません。正規表現の問題は、正規表現では処理できないため、完全に有効な電子メール アドレスが無効であると伝える (誤検出) ことは、ユーザーの観点からは失礼で無礼なことです。この目的のための状態エンジンは、各 RFC に従って電子メール アドレスを分解することで、無効と見なされる電子メール アドレスを検証し、修正することもできます。これにより、次のような、より快適なエクスペリエンスが可能になります。

指定された電子メールアドレス「myemail@address,com」は無効です。[メールアドレス]'?

参照メールアドレスの検証コメントを含む。または電子メールアドレスの比較 正規表現の検証

正規表現の視覚化

Debuggex デモ

おすすめ記事