2012-02-15 8 views
0

これは私が使用していた正規表現されていますなぜ私の日付は正規表現でfalseを返しますか?

if (preg_match("/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/", $_POST["collection-date"]) === 0) { 
     $errors .= "\n Error: Invalid Collection Date"; 
     $collectiondate = FALSE; 
    } 

現在$_POST['collection-date']15/02/2012に等しく、それはまだfalseを返します。どうしてこれなの?

ありがとうございます。

+0

あなたの質問に 'var_dump($ _ POST ['collection-date']);'の出力を追加してください。 – hakre

+1

'$ _POST ['collection-date']'の文字列の前後に空白がありますか? –

+0

私はこれを得ます:string(0) "" – michaelmcgurk

答えて

3
$split = explode('/', $date); 
if (!isset($split[2]) || !checkdate($split[1],$split[0],$split[2])) { 
    $errors .= "\n Error: Invalid Collection Date"; 
    $collectiondate = FALSE; 
} 

誰かがあなたはおそらく同様に必要な99/99/201231/02/2012として無効な日付を、入力した場合また、これは偽検証します。

+1

'||必要なら '15/02/2012/someotherstuffhere'と入力するか、' $ split'の変数を使用して後で何かを忘れる場合には 'isset($ split [3])'別のスラッシュと内容を追加してください。 – Mike

+0

多くの、多くのありがとうマイク。あなたのソリューションはそのトリックでした。今すぐGlitchのコメントを読む:-) – michaelmcgurk

1

私はこの正規表現をチェックして動作します。

私はあなたに少しアドバイスをしていますが、preg_match()(これはよく見ました)のマッチの数を確認しないでください。それは非常に混乱して、私を信頼してください。 == 0は、見つからなかった場合を意味します。個人的には、たとえpreg_match()が整数(一致の数)を返し、ブール値でなくても、ブール値のコンテンツに使用します。しかし、それは本当に重要ではありません - 0はPHPでfalseであり、その他の整数はブール値の文脈でtrueです。この場合、通常はあなたの期待と一致します。0は通常失敗を意味します。

第2に、false以外の$collectiondateへの割り当てはありません。私はそれが意図的なものかどうかはわかりませんが、決して正の価値を送れない場合は、通常nullまたはfalseです。ブール値のコンテキストでは、これらの値は両方ともfalseを返します。実際、nullがブール値に変換されているため(false !== null)、!==は変換をスキップします(https://stackoverflow.com/a/80649/736054に記載されている理由で==の代わりに===を使用することをお勧めします)。

関連する問題