2011-08-09 15 views
1

簡単な電子メールの検証スクリプトは、私に失敗し続けます。PHPの正規表現

if(!preg_match('^[^@]{1,63} @ [^@]{1,255}$', $input)) { 
    return false; 
} 

ローカルアドレスとドメインアドレスの正しい長さを1つだけ '@'記号にしてください。しかし、有効な電子メールはこのテストに合格しません。 error_logには、「@」は未定義の変数であるというメッセージが表示され続けます。私はそれをエスケープすると思いますか?それらの前にバックスラッシュを置くことは役に立たなかった。

ありがとうございます。

*編集:電子メールの検証スクリプトにはさらに多くのものがありますが、これらの部分は正常に機能しているため投稿しませんでした。これは明らかに唯一の妥当性検査ではありませんが、それは私にエラーを引き起こす唯一のものです。

+0

なぜスペースが '@'周りがありますか? – rockerest

+1

これは '!" $ $%^&*()@! "$ $%^&*()'に対してもtrueを返します。悪い時。 – adlawson

+0

スペースは、目の前に置いておくだけです。リアルバージョンはありません。おそらくそれを追加してはいけません。 – Renzo

答えて

4

単純な正規表現でメールを検証すると、失敗するようになります。きちんとPHPでの電子メールアドレスを検証する長さを通過するこの記事を、確認してください:そこのコメントから

http://www.linuxjournal.com/article/9585?page=0,0

を、あなたも(&効果的な簡単なようであるPHPのにfilter_var機能を、確認してくださいかもしれませんほとんどの場合、ホイールを再開発しない方が良いでしょう):

if(!filter_var($email, FILTER_VALIDATE_EMAIL)) 
{ 
exit("E-mail is not valid"); 
} 
+0

ああ私は実現します。それは検証の一部ですが、私は他の多くのステップを踏んでいますが、これが問題の1つの部分であり、エラーが発生し続けている理由が分かりません。 – Renzo

+0

それにもかかわらず、filter_varがあなたに代わって、PHPに組み込まれていて、なぜそこにすでにあるものを再構築して動作させるのかを確認しますか?その時間をプロジェクトの他の部分に費やすことができます:) –

+0

PHP内部でFILTER_VALIDATE_EMAILが実際には正規表現であることに気づきましたか? (最高のものではない) – mario

1

電子メールアドレスの検証には正規表現を使用しないでください。本当に。

とにかく問題はpreg_match構文です。最初のパラメータは、/ [...] /という形式のパターンを受け入れます。/はPCRE delimitersです。

だからあなたの呼び出しは次のようになります。

if(!preg_match('/^[^@]{1,63}@[^@]{1,255}$/', $input)) { 

しかし、それそのように使用しないでください。

0

彼らは失敗のどちらか0またはfalseを返すためpreg_match()およびその他のpreg_*()関数は、エラー時にスローされません場合はそう単純で信頼性がないことを半ばに保管してください。

CleanRegexの使用を検討してください:

if (pattern(('^[^@]{1,63}@[^@]{1,255}$')->matches($input)) 
{ 
    // Matches! :) 
}