2014-06-30 22 views
0

我只需要允許9 am-4pm之間的時間。使用正則表達式驗證時間

目前,我有:

/([01]?[0-9]|2[0-3]):([0-5][0-9])[APap][mM]/ 

其中工程驗證格式hh:mmPM(不區分大小寫)。

我在正則表達式可怕,但有寫它,所以它僅允許幾次都是一個辦法:

9:(0-59)AM 
10:(0-59)AM 
11:(0-59)AM 

例如:它應該允許9:05AM但不允許8:59AM

分別,我還需要另一個正則表達式爲:

12:(0-59)PM 
1:(0-59)PM 
2:(0-59)PM 
3:(0-59)PM 

例如:它應該允許3:05PM但不允許4:01PM

我對我的驗證當前的代碼:

var time = document.forms["presentation"]["presentation-time"].value; 
if (!/([01]?[0-9]|2[0-3]):([0-5][0-9])[APap][mM]/.test(time)) { 
    $("#timeError").show(); 
    $("#presentation-time").focus(); 
    return false; 
} 
else { 
    $('#timeError').hide(); 
} 

我想在驗證的其餘部分的if語句做& &的。

+0

什麼是小時格式? 12小時還是24? –

+0

我打算用12小時的格式。 – user2101171

回答

0

你猜對了差不多了吧,你只需要約束的時間:

/((0?9|1[01]):([0-5][0-9])AM)|((12|0?[123]):([0-5][0-9])PM)/ 
+0

這個作品完美。快速的問題,是否有學習正則表達式的好資源?謝謝您的幫助! – user2101171

0

/(1?[019]):([0-5][0-9])(AM)|(1?[1234]):([0-5][0-9])(PM)/是我能想到的唯一方法。

編輯:

一個不是強迫的通過正則表達式時驗證是簡單地使用反向引用捕獲的小時,分​​鍾和一天中的時間值,並使用這些做確認,而不是簡單得多的方式。它在事後添加了更多的條件邏輯,但在我看來,它比正則表達式更容易閱讀。

var time = document.forms['presentation']['presentation-time'].value; 
var backreferences = new RegExp('(\d+):(\d+)(AM|PM)','i').test(time); 
var hours = backreferences[1]; 
var minutes = backreferences[2]; 
var timeOfDay = backreferences[3]; 
if (!((hours >= 9 && hours <= 12 && timeOfDay === 'AM') || 
    (hours <= 4 && timeOfDay === 'PM'))) { 
    $('#timeError').show(); 
    $('#presentation-time').focus(); 
    return false; 
} else { 
    $('#timeError').hide(); 
} 
+0

第一個'1?'在這裏是一個不好的想法,因爲你在第一種情況下允許'19:05 AM',或者在最後一個允許'11:10 PM'。 – Holt

+0

嗯,好點。我沒有想到這一點。 – RevanProdigalKnight

+0

如前所述,我不是在正則表達式很好,但會像 /(0?[9] | 1 [01]):([0-5] [0-9])(AM)/工作AM部分? 根據霍爾特的建議和RevanProdigalKnight的代碼 – user2101171

0

我認爲這正則表達式將做的工作:

/^(([0]?9|1[01]):([0-5][0-9])AM)|((12|0?[1-3]):([0-5][0-9])PM)|(0?4:00PM)$/i 
0

正則表達式

(0?[9]:[0-5][0-9])([aA]m|[pP]m)|(0[1-3]:[0-5][0-9])([[pP]m)|(\b[1-3]:[0-5][0-9])([[pP]m)|(1[0-2]:[0-5][0-9])([aA]m) 

Demo