2012-01-13 14 views
2

に私はJavaScriptで動作する電子メールアドレスをチェックする正規表現がない:正規表現は、JavaScriptで動作しますが、PHP

var re = /^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/; 
"[email protected]".search(re); // returns 0 

をしかし、私は同じ正規表現を使用して、PHPにするpreg_match()を使用して電子メールで送信する場合それはdoesnの仕事!

$re = "/^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/"; 
echo preg_match($re,"[email protected]"); 
// echoes 0 - not 1!! 

EDIT

わかりましたので、私はより詳細な情報を追加する必要があります。

完全なコードはここにある:私はちょうどするpreg_match()(forループの外)を行うと

$re = '/^([0-9a-zA-Z]([-.\w\+\%\#\!\$\'\*\/\=\?\^\`\{\|\}\~]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/'; 

    if(is_array($recipients)){ 
     for($i=0;$i<count($recipients);$i++){ 
      echo preg_match($re,$recipients[$i]) . " - " . $recipients[$i] . "<br />"; 
     } 
    } 

、それが適切にパターンに一致します。しかし、このループに入っていれば、それは検証されません!

+3

「foo + bar @ example.com」はありませんか? ( '%'、 '_' * et al。*はもちろん)私は中程度の悲しいパンダです。 – Piskvor

+2

これは奇妙です。 [IDEOne](http://ideone.com/JHuqs)は同意しないようだ。 –

+2

私のためにうまく働いています... – prodigitalson

答えて

0

一般的な構文のバリエーションの広い範囲を持っている電子メールの検証のためにPHPSに組み込み正規表現を使用することをお勧めします:

filter_var($email, FILTER_VALIDATE_EMAIL) 

filter_varを参照してください。
しかし、btw、FILTER_VALIDATE_EMAILも正規表現を使用して実装されています。それについてはhttps://github.com/php/php-src/blob/master/ext/filter/logical_filters.c#L522を参照してください。

あなたが元々持っていた空白問題とは関係ありません。

+0

メールを検証する正しい方法ですから、この回答を受け入れています。これは、 'trim()'の解決法と組み合わせて、私の答えを解決しました。 – Martin

4

二重引用符で囲んだ文字列内で使用する場合、バックスラッシュがPHPで特別な意味を持つことを忘れてしまいます。

echo $re;あなたはちょうどあなたがを期待していることを確認することがありますか?それはありますか?パターンのために一重引用符で囲まれた文字列に切り替えることをお勧めします。あるいは、すべて\をエスケープしてください。

$re = "/^([0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})$/" 
$re = '/^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/'; 

ところで、他にも言及したように、does return 1です。

二重引用符で囲まれたパターンでは、このインスタンスに含まれていなくてもエスケープすることができます。

+1

それは部分的に正しいだけです。無効なエスケープシーケンスの場合、PHPは入力を返します。 'echo" \ w "'は実際には "\ w"を出力します。 –

+0

@LinusKleen:合意しました。答えの一番下に明示的なメッセージを少し追加しましたが、フィードバックに感謝します。 –

+0

私はそれをエコーし​​、それは私が期待したものです。私は一重引用符に切り替えましたが、まだ行っていません。 – Martin

0

エスケープ文字が無視されるように、一重引用符を使用する必要があります。

$re = '/^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/'; 
preg_match_all($re, '[email protected]', $arr, PREG_PATTERN_ORDER); 
var_dump($arr);