我有一個日期(例如.yyyy-mm-dd hh:mm:ss),我希望能夠返回true,如果我們有一個匹配該模式的字符串,完全,或者部分匹配該模式,從頭到尾。例如。 44
將匹配模式,因爲44
將匹配yy,但-12
不匹配,因爲-
不是有效的「y」字符。匹配從一開始的一部分字符串
一些不雅的解決方案出現在我身上。我可以這樣做preg_match
:
#^\d(\d(\d(\d(-)?)?)?)?$#
這只是執行基於年份的部分匹配。它會需要擴展出佔月,日,小時,分鐘,等等,但應該表現出的想法#1
我也可以做類似...
$patterns = [
'',
'\d',
'\d\d',
'\d\d\d',
'\d\d\d\d',
'\d\d\d\d-',
...
];
isset($patterns[strlen($str)] && preg_match('#^' . $patterns[strlen($str)] . '$#', $str)
但是,這種情況似乎也很複雜。
我也可以這樣做:
switch (strlen($str)) {
case 1: return preg_match('#^\d$#', $str);
case 2: return preg_match('#^\d\d$#', $str);
case 3: return preg_match('#^\d\d\d$#', $str);
case 4: return preg_match('#^\d\d\d\d$#', $str);
case 5: return preg_match('#^\d\d\d\d-$#', $str);
...
}
但似乎臃腫爲好。
換句話說,我正在尋找2005-
將返回true的函數,2
和2005-1
也會如此。但-2005
將返回false,如205-
或neubert
。
我希望能夠做的是將有效值傳遞給SQL查詢。例如。 WHERE date_column LIKE '$str%'
。如果date_column
是DATETIME,那麼搜索-12-
是浪費時間,因爲date_column
不可能將其作爲值。
任何想法?
我使用'^'和'$'在我的模式。我的第一個和在'preg_match'調用中的第二個一樣。 '$ patterns'數組在'#^'和'$#'之間連接。 – neubert
什麼值是可選的?也許'^ \ d {4} - \ d {2} - \ d {2} \ d {2}:\ d {2}:\ d {2} $'?您可以將'\ d's擴展爲允許的範圍,但這會變得難以閱讀。 – chris85
您可以爲上述模式添加一些有效和無效的輸入嗎? – anubhava