0

メールアドレスの検証が扱いにくいテーマであることは誰もが知っています。RFC 全体をエンコードせずに処理する最善の方法については、非常に多くの意見があります。しかし、2009 年以降、IDN の問題はさらに難しくなり、IDN の問題に取り組んでいる人をまだ見たことがありません。

これが私が使ってきたものです:

preg_match(/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,6}\z/i)

ほとんどのメール アドレスにはどちらが適していますが、ラテン語以外のメール アドレスと照合する必要がある場合はどうすればよいですか? 例: bob@china.中國、または bob@russia.рф

完全なリストについては、こちらをご覧ください。(リストの一番下にあるすべてのラテン語以外のドメイン拡張子に注意してください。)

この件に関する情報はここで見つけることができます。彼らが言っていることは、これらの新しい文字はマシン レベルでは単に「.xn--fiqz9s」および「.xn--p1ai」として読み取られるということですが、私は 100% ではありません。もちろん。

もしそうなら、それは私のコードで次のようにすることを検討する必要がある唯一の変更を意味しますか? (.travelersinsurance や .sandvikcoromant などのドメイン拡張子の場合)

preg_match(/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,20}\z/i)

注意: これは、このページの議論とは関係ありません。正規表現を使用して電子メール アドレスを検証する

4

3 に答える 3

2

確認メールを送信する必要があるという実証済みの提案に固執します。何度も何度も更新する必要がある派手な正規表現は必要ありません。彼らが自分のメールアドレスを知っていると仮定して、それを入力させてください。

こういう状況になるといつもそうしてる。どちらかといえば、メールを2回入力するようにします。サイト/プロジェクトの重要な部分により多くの時間を費やすことができます。

于 2016-02-25T21:57:13.763 に答える
-1

これが私が最終的に思いついたものです。

preg_match(/^[\pL\pM*+\pN._%+-]+@[\pL\pM*+\pN.-]+\.[\pL\pM*+]{2,20}\z/u)

これは、 \pL\pM*+\pNなどの Unicode 正規表現を使用して、任意の言語の文字と数字を処理するのに役立ちます。

\pL あらゆる言語のあらゆる種類の文字、大文字または小文字。

\pM*+ マークを結合している 0 個以上のコード ポイントに一致します。別の文字と組み合わせることを意図した文字 (アクセント、ウムラウト、囲むボックスなど)。

\pN 任意の数。

上記の式は、me@mydomain.com のような通常の電子メール アドレスと、中 3_yÄhমহাজোটেরoo文%网+d-fελληνικά@πyÄhooαράδειγμα.δοκιμή のような耳障りな電子メール アドレスに対して完全に機能します。

人々が自分の電子メール アドレスを入力できると信じていないわけではありませんが、人々は間違いを犯します。このコードを別の状況で使用することもあります。例: 10,000 個の電子メール アドレスの既存のリストの整合性を再確認する必要があります。その上、私は常にユーザー入力を信用せず、常にフィルタリングするように教えられました.

アップデート

これは、 phpliveregex.comなどのサイトでテストした場合や、utf-8 コンテンツの通常の文字列を解析するときにローカルでテストした場合は完全に機能しますが、ブラウザーがそのコンテンツ タイプのフィールドを通常のラテン語に変換するため、電子メール フィールドでは正しく機能しないことを発見しました。したがって、bob@china.中國、または bob@russia.рф のような電子メール アドレスは、サーバーが受信する前に、bob@china.xn--fiqz9s または bob@russia.xn--p1ai に変換されます。元のフィルターで本当に欠けていたのは、ドメイン拡張子からのハイフンを含めることだけでした。

最終版は次のとおりです。

preg_match('/^[a-z0-9%+-._]+@[a-z0-9-.]+\.[a-z0-9-]{2,20}\z/i');
于 2016-02-26T09:21:06.310 に答える