2017-03-01 5 views
1

私はこのコードをWebアプリケーションの途中に置いています。PHP preg_matchとチェックデートを組み合わせた

if (preg_match ("/^[-0-9]/", $strDate) == TRUE) 
    { 
     $dateParts = explode("-", $strDate); 
     if (count($dateParts) === 3) 
     { 
      try 
      { 
       if (checkdate($dateParts[0], $dateParts[1], $dateParts[2]) === TRUE) 
       { 
        return TRUE; 
       } 
      } 
      catch (Exception $e) 
      { 
       //purposely blank for now. 
      } 
     } 
    } 

周囲のコードは含まれていないため、かなり長いアプリケーションです。まず、$strDate変数を私はそこに保持されているものを正確に知っています。私はifステートメントが始まる直前にそれをエコーすることができます。 $strDateが有効な日付または 'TBD'の任意の組み合わせである場合、ステートメントは期待どおりに検証されます。この問題は、無効な日付が関数に入るときに発生します。例えば

$strDate = '03-01-2017asdf'; 

この入力で、私はそれをキャッチし、ifの文からそれをキックするpreg_matchを期待します。代わりにtry-exceptを実行し、phpは非形成エラーをスローします。私がここで間違っていることは何ですか?私はそれが私のpreg_matchステートメントと関係していると確信しています。

答えて

3

入力文字列の最後まで試合を要求するように正規表現を変更します。

/^[-0-9]+$/ 

ので、前と言うことは、あなたが複数の数字とハイフンを持つことができると言って+を追加し、$パターンは文字列の最後まで一致しなければならないので、あなたの例のように他のものを追加することはできません。もちろん、this answerのように、日付の有効な部分、ハイフンの数などをチェックする、より複雑な正規表現を探すことができます。 $strDateが数字で始まっているかどうか

+1

あなたは '$'記号を追加してうれしいが、日付パターンは依然として良いかもしれない。 – MaxZoom

+0

そうですが、日付一致をパターンに折りたたむことが次のステップでした。私はちょうどこの部分を最初に働かせたいと思った。これは完全に機能しました!ありがとう!私はそれがちょっとしたエラーだったと知っていて、それを理解できませんでした。ここや周りのWeb上で検索した後、私はあきらめて、実際に質問しました。 –

+0

@MaxZoom、あなたは私の答えの最後まで読みましたか? ;-) – trincot

0

あなたpreg_matchチェック - 03-01-2017asdfTRUEとして、数字で条件結果を開始しますので、日付の形式が完全に...正しいかどうか。指定された日付形式の場合

MM-DD-YYYY)、あなたはこのコードを使用することができます:

if (preg_match ("/^(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])-[0-9]{4}$/", $strDate) == TRUE) 
0

を私はあなたが何をすべきかを、ここでのコードの例をCarbon

を使用するためにあなたの日付を検証し、フォーマットすることをお勧めあなたは、あなたの関数で行いますを使用することですあなたの日付を検証する

use Carbon\Carbon; 
class DateHelper 
{ 
    /** 
    * @param $strDate valid format d-m-Y 
    */ 
    public static function validate($strDate) 
    { 
     try { 
      $carbon = Carbon::createFromFormat('d-m-Y', $strDate); 
      return true; 
     } catch (\Exception) { 
      //invalid date 
     } 

     return false; 
    } 

} 

var_dump(DateHelper::validate('03-01-2017asdf')); //return false 
var_dump(DateHelper::validate('03-01-2017')); //return true 
0

最もエレガントで最短の道を10 phpオブジェクト。

あなたはこのようなあなたの機能を構築することができ:

function validateDate($date, $format = 'Y-m-d H:i:s') 
{ 
    $d = DateTime::createFromFormat($format, $date); 
    return $d && $d->format($format) == $date; 
} 

機能は、このanswerまたはphp.net

からコピーされた、すなわち:

var_dump(validateDate('03-01-2017asdf', 'm-d-Y')); // bool(false) 
var_dump(validateDate('03-01-2017', 'm-d-Y')); // bool(true) 

だからあなたの検証の条件は次のようになります。

if (validateDate($strDate, 'm-d-Y')) { 
    ... 
    // Do some stuff 
    ... 
} 

はそれがお役に立てば幸いです。

関連する問題