2013-02-18 59 views
0

我有一個允許用戶輸入日期的輸入字段。使用Javascript檢查特定格式的輸入值

我需要這個日期是按以下格式:10Jan13(大小寫並不重要)

有,如果使用將正確格式的日期爲用戶彈出壓延機。

我想檢查使用Javascript以確保用戶沒有任何粘貼或不正確鍵入日期輸入onblur的價值。

我目前只檢查數量字段是這樣的:

var numbers = /^[0-9]+$/; 

if (!BIDInput.value.match(numbers)) 
{ 
    checkedInput.value = ""; 
    alert('Not a number'); 
} 

,我檢查信件,只有場是這樣的:

var letters = /^[a-z]+$/ 

if (!nameInput.value.match(letters)) 
{ 
nameInput.value = ""; 
    alert('Not a letter'); 
} 

我想檢查的日期格式如果可能的話也是一種類似的方式但是完成任務的任何事情都可以做到。任何人都可以在正確的方向上指出我如何完成這項工作?

我知道客戶端驗證不會取代服務器端驗證。這僅用於用戶體驗目的。

回答

3

你幾乎在那裏與你有什麼。基本上你的格式是一個或兩個數字,然後是12個可能的字符串之一,然後是兩個數字。因此,例如:

​​3210

擊穿:

  • ^開始字符串。

  • \d{1,2}一位或兩位數字。

  • (:?...)非捕獲基團。或者你可以使用捕獲組,如果你喜歡。

  • Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec變更,允許這十二種選擇中的任何一種。自然你可以添加更多,如果你喜歡。如果您有兩種選擇以相同的方式開始(例如JanJanuary),請將較長的一個放在更改中。

  • \d{2}兩位數。


附註:我不得不建議對兩位日期的原則,凡在本世紀,我們目前特別給出!


應對Amberlamps'評論說,這並不驗證日期:一旦你驗證了該格式,是微不足道的再檢查日期本身,如果你喜歡(排除30Feb13,例如):

var validateDateString = (function() { 
    var monthNames = "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec".toLowerCase().split("|"); 
    var dateValidateRex = /^(\d{1,2})(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(\d{2})$/i; 
    var arbitraryCenturyCutoff = 30; 

    function validateDateString(str) { 
    var match; 
    var day, month, year; 
    var dt; 

    match = dateValidateRex.exec(str); 
    if (!match) { 
     return false; 
    } 
    day = parseInt(match[1]); 
    month = monthNames.indexOf(match[2].toLowerCase()); // You may need a shim on very old browsers for Array#indexOf 
    year = parseInt(match[3], 10); 
    year += year > arbitraryCenturyCutoff ? 1900 : 2000; 

    dt = new Date(year, month, day); 

    if (dt.getDate() !== day || 
     dt.getMonth() !== month || 
     dt.getFullYear() !== year) { 
     // The input was invalid; we know because the date object 
     // had to adjust something 
     return false; 
    } 
    return true; 
    } 

    return validateDateString; 
})(); 

......或沿着這些線的東西。

Live Example | Source

或者,如果(像我)你討厭看到這樣月份名稱列表列表重複你可以使用RegExp構造一個字符串,而不是,但你必須記住要複製您的反斜槓:

var monthNamesString = "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec"; 
var monthNames = monthNamesString.toLowerCase().split("|"); 
var dateValidateRex = new RegExp("^(\\d{1,2})(" + monthNamesString + ")(\\d{2})$", "i"); 

Live Example | Source

+0

這雖然不會驗證有效日期。 – Amberlamps 2013-02-18 13:08:25

+0

@Amberlamps:OP說*「我想檢查日期**格式** ...」*(我強調)。 – 2013-02-18 13:09:19

+0

@Amberlamps:雖然這不是正則表達式的工作。日曆邏輯應單獨驗證。 – nhahtdh 2013-02-18 13:09:59

2

您可以使用下面的正則表達式來檢查從2個開始數字的字符串,然後是3個字符,然後2號

[0-9]{2}[a-zA-Z]{3}[0-9]{2}