2017-03-01 77 views
1

我有這段代碼在我的web應用程序的中間。PHP preg_match結合checkdat

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是有效日期或「待定」的任意組合,則該語句按預期進行驗證。當無效日期進入功能時,問題就來了。

例如,

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

有了這個投入我期望preg_match趕上它,踢它出if聲明。相反,它運行try-except,而php會拋出一個非形式的數字錯誤。任何想法我在這裏做錯了嗎?我確信它與我的preg_match聲明有關。

回答

3

改變你的正則表達式需要匹配,直到輸入字符串的結尾:

/^[-0-9]+$/ 

所以添加+說你可以有多個數字和連字符,然後$說,以前的模式必須匹配,直到字符串結束,所以沒有其他的東西可以像你的例子一樣添加。當然,您可以查找更復雜的正則表達式來檢查日期的有效部分,連字符的數量等等,這可能會變得相當複雜,正如您在this answer中看到的那樣。

+1

很高興你添加了'$'符號,但日期模式仍然可能會更好。 – MaxZoom

+0

是的,將日期匹配摺疊成圖案是下一步。我只是想先讓這部分工作。這完全奏效!謝謝!我知道這是一個小小的錯誤,只是無法弄清楚。在這裏和網絡上搜索幾個小時後,我放棄了,實際上問了一個問題。 –

+0

@MaxZoom,您是否閱讀過我的答案? ;-) – trincot

0

preg_match檢查$strDate是否以數字開頭 - 不是日期格式是否完全正確。既然03-01-2017asdf以數字開頭,病情結果TRUE

對於給定的日期格式(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

驗證日期的最優雅和最短的方法是使用DateTime個php對象。

你可以建立你的函數是這樣的:

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

功能,從這個answerphp.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 
    ... 
} 

希望它能幫助。