2010-12-13 11 views
0

この正規表現で何が問題になっていますか?php email regex

function validateEmail($email){ 
    if (eregi("^([a-z]|[0-9]|\.|-|_)[email protected]([a-z]|[0-9]|\.|-|_)+\.([a-z]|[0-9]){2,3}$", $email, $arr_vars) && 

    !eregi("(@.*@)|(\.\.)|(@\.)|(\[email protected])|(^\.)", $email, $arr_vars)){ 
    return true; 

    }else{ 
    return false; 
    } 
} 

ときに使用:

$email = "[email protected]"; 
if (validateEmail($email) != 1){ 
//show error 
} 

いただきました!間違ったことは、falseを返し、エラーが表示されますか?

答えて

1

はじめに、([a-z]|[0-9]|\.|-|_)は、[a-z0-9\._-]のような簡単なものに変更することができます。これは、[]内の値を含むクラスです。

実際の問題は最後の{2,3}で、2〜3文字(「info」接尾辞は4文字)を象徴しています。

EDIT 余談として、私はあなたが結果のライブラリーを検索することができ、このようなregexlib.comなどのウェブサイトをお勧めします。また、RegExrは、パターンをテストし、その結果をリアルタイムで見るための有用なウェブサイトです。

+0

ドメインエクステンションのために3文字しか許されていないと私は考えました:) – Latox

3

正規表現の末尾にある{2,3}は、そのパターンが少なくとも2、と一致していても、の文字と一致しない場合にのみ一致すると言います。 infoは文字TLDです。

は仕方によって、同様にあなたのコードで他の問題があります。

まず、あなたの「使用できる文字」リストは不必要に複雑です。 ([a-z]|[0-9]|\.|-|_)の代わりに、[a-z0-9\.-_]のように、すべての許容文字を1つの[]セットに指定できます。

第2に、eregi()関数はPHP 5.3以降で廃止されました(リンクをクリックすると大きな警告が表示されます)。代わりにpreg_match()を使用してください。

if (condition) { 
    return true; 
} else { 
    return false; 
} 

あなたはちょうどこのにそれを短縮することができます:

第三に、いつでもあなたはこのような何かを参照してください

return (condition); 

この理由は(condition)はそう、ブール値を返すということですそれをドラッグすると、基本的に次のようになります。

if (true) { 
    return true; 
} else { 
    return false; 
} 

1つのl注意すべき点は、ほとんどの場合、電子メールアドレスで正規表現を実行する必要はないということです。アドレスに確認メールを送信し、受信者がそれを開いてメール内のリンクをクリックした場合は、確認してください。

これは、アドレスのクイックサニティチェックを実行しても問題がないと言います。

この場合、.の文字が少なくとも1文字の後ろの文字と少なくとも2文字以外の文字のいずれかで、住所に@という文字があることを確認してください - .以降の文字は.です。

実際の規則に従って電子メールアドレスを検証する適切な正規表現は、それを記述するRFCではルールが絶望的です。人々はそのような正規表現を作成するために勇敢な試みをしており、それらは文字通りページと長くなります。

希望に役立ちます。

1

まず、EREG()とeregi()するpreg_match()の賛成でを推奨されていません - あなたはすべてでそれらを使用するべきではありません。

さらに、最初の正規表現は単に間違っています。 TLDは常に2文字または3文字であると仮定しているため、.info、.aero、.travelなどの新しいTLDでは動作しません。

さらに、+文字は、ローカル部分で完全に有効です。電子メールアドレス(例:[email protected]) - あなたの正規表現に失敗するウムラウトのようなものにも同じことが適用されます。

([a-z]|[0-9]|\.|-|_)もあまり意味がありません、それを書くためにずっと短いANS少ない混乱方法があります:([a-z0-9._-])

は実際には、電子メールアドレスを検証する正規表現を使用することは良いことではありません。適切な方法は、アドレスからドメイン(@の後のすべて)を抽出し、有効なDNSレコードがあるかどうかを確認することです(通常はMXですが、MXレコードがない場合はAも同様です)。もう一つのステップは、DNSレコードが指し示すIPをリッスンしているメールサーバーが実際に存在するかどうかをテストすることです。サーバーが受信者を知っていればそのサーバーに問い合わせることもできます(実際に電子メールを送信することなくすべてのサーバーがそのような情報を提供するわけではありません)。

2

.infoは2文字または3文字ではありません。 (あなたの正規表現の最後の部分)

しかし、言った:あなた自身の電子メールの正規表現のバリデータを書かないでください。あなたが思っている以上に複雑で、あなたはそれを台無しにするでしょう。例えば、これはhttp://www.regular-expressions.info/email.html

(?:[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])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-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])+)\]) 

からその上に、より正確で高度なテイクではなく、まともなライブラリを提供して誰かを見つけることです。

+0

これは私のPHPを壊し、内部サーバーエラー500を引き起こします。 –

0

メールアドレスが有効かどうかを確認する唯一の方法の1つは、実際に電子メールを送信することです。

また、あなたのチェッカーは、例えば、それらに'を持っている任意のアドレスのために失敗します:Ian.O'[email protected]

0

の代わりに使用する正規表現は、使用することができますPHPの適用FILTER_VALIDATE_EMAILフィルタとfilter_var()に建てられました。有効な電子メールであり、非常に複雑な正規表現を使いこなす必要がない場合はtrue(y)/ falseを返します。 PHPのValidation、およびfilter_varページから

$email_a = '[email protected]'; 
$email_b = 'bogus'; 

if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) { //returns true 
    echo "This (email_a) email address is considered valid."; 
} 
if (filter_var($email_b, FILTER_VALIDATE_EMAIL)) { //returns false 
    echo "This (email_b) email address is considered valid."; 
} 

あなたは次のようにそれを使用しています。