0

これは奇妙に聞こえますが、私はこの関数をかなり前から使用しており、「突然、ある日から別の日に」、一部のアドレスを正しい方法でフィルタリングしなくなりました。しかし、理由がわかりません...

function validate_email($email)
{
/*
(Name) Letters, Numbers, Dots, Hyphens and Underscores
(@ sign)
(Domain) (with possible subdomain(s) ).
Contains only letters, numbers, dots and hyphens (up to 255 characters)
(. sign)
(Extension) Letters only (up to 10 (can be increased in the future) characters)
*/

$regex = '/([a-z0-9_.-]+)'. # name

'@'. # at

'([a-z0-9.-]+){2,255}'. # domain & possibly subdomains

'.'. # period

'([a-z]+){2,10}/i'; # domain extension 

if($email == '') { 
    return false;
}
else {
$eregi = preg_replace($regex, '', $email);
}

return empty($eregi) ? true : false;
}

たとえば、「some @ gmail」は正しいものとして表示されるので、tldで発生したようです-誰かが理由を教えてもらえますか?

事前にどうもありがとうございました!

4

4 に答える 4

2

.任意の文字を意味します。実際に「ドット」を意味する場合は、エスケープする必要があります。\.

正規表現には他にもいくつかの問題があります。

  • 正規表現では大文字を使用できません:[a-zA-Z0-9]
  • 正規表現で Unicode 文字を使用することはできません (たとえば、é、ç などを含むメール アドレス)
  • +電子メールアドレスで実際に許可されている特殊文字
  • ...

メールの検証は非常にシンプルにします。@ が存在するかどうかを確認し、そのままにしておきます。本当に電子メールを検証したい場合、正規表現は恐ろしいものになります。

詳細な説明については、このSO の回答を確認してください。

于 2012-10-09T14:51:36.753 に答える
1

「ピリオド」でコメントしたもの:

'.'. # period

実際には、任意の文字のプレースホルダーです。\.代わりにすべきです。

ただし、物事を過度に複雑にしています。このような検証は、空のフィールドまたは明らかに間違っているもの (たとえば、電子メール フィールドに入力された名前) を拒否するために存在する必要があります。したがって、私の経験では@、構造が正しいかどうかについてあまり心配せずに、含まれているかどうかを確認するのが最善のチェ​​ックです。実際、有効なメールアドレスを忠実に検証し、無効なメールアドレスを拒否する正規表現を書くことができます。それは、テキストの画面にまたがるモンスターです。そうしないでください。接吻。

于 2012-10-09T14:51:13.337 に答える
1

エラーは次の行にあると思います。

'.'. # period 

ここでは文字通りのピリオドを意味します。しかし、正規表現ではピリオドには特別な意味があります (「任意の文字」を意味します)。

バックスラッシュでエスケープする必要があります。

于 2012-10-09T14:52:38.383 に答える