2014-10-24 2 views
0

Это регулярное выражение:дата Validate на нажатие клавиши не работает

pattern =/^([0-9]{2})-([0-9]{2})-([0-9]{4})$/; 

Привет, ребята, я нашел простое регулярное выражение для формата даты, без проверки на високосный год, но на моей скрипке я все еще могу ввода других недопустимых символов , См. Мой FIDDLE.

+0

Регулярное выражение в вашем примере соответствует полному формату даты, не ограничивая то, что можно ввести. Кроме того, вы используете двойной эквивалент для назначения шаблона. – getWeberForStackExchange

+0

Ошибка Typo на знаке двойного равенства, поэтому проверка даты должна быть в отпуске на входе? – bumbumpaw

+0

Извините, мое первое сообщение было немного коротким. Если я правильно понял вопрос, вы хотели бы, чтобы пользователь вводил дату в точно определенном формате, когда они печатают его. Таким образом, они не могли вводить буквы или что-то еще, только два числа, дефис, еще два числа, дефис и четыре числа. Это цель? – getWeberForStackExchange

ответ

2

http://jsbin.com/ruhaxo/9/edit

Ваш код сделал мне немного неудобно, так что я пытался написать это более просто, так что было бы легче читать, вы можете вытащить часть, что вам нужно, что я действительно думаю, что это просто event.preventDefault(), когда есть совпадение. Просто для расширения, а также: http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes вы ищете коды символов не буквальные числа.

$('input').on('keypress', function (e) { 
     var leng = $(this).val().length; 

     if (window.event) { 
     code = e.keyCode; 
     }else { 
     code = e.which; 
     }; 

     var allowedCharacters = [49,50,51,52,53,54,55,56,57,48,45]; 
     var isValidInput = false; 

     for (var i = allowedCharacters.length - 1; i >= 0; i--) { 
     if(allowedCharacters[i] == code){ 
      isValidInput = true; 
     } 
     }; 

     if(isValidInput === false || /* Can only input 1,2,3,4,5,6,7,8,9 or - */ 
     (code == 45 && (leng < 2 || leng > 5 || leng == 3 || leng == 4)) || 
     ((leng == 2 || leng == 5) && code !== 45) || /* only can hit a - for 3rd pos. */ 
     leng == 10) /* only want 10 characters "12-45-7890" */ 
     { 

     event.preventDefault(); 
     return; 
     } 

    }); 

Вы также можете сделать это с помощью объекта, а не массива. Что немного легче читать:

$('input').on('keypress', function (e) { 
     var leng = $(this).val().length; 

     if (window.event) { 
     code = e.keyCode; 
     }else { 
     code = e.which; 
     }; 

     var allowedCharacters = {49:1,50:2,51:3,52:4,53:5,54:6,55:7,56:8,57:9,48:0,45:'-'}; /* KeyCodes for 1,2,3,4,5,6,7,8,9,- */ 

     if(typeof allowedCharacters[code] === 'undefined'|| /* Can only input 1,2,3,4,5,6,7,8,9 or - */ 
     (code == 45 && (leng < 2 || leng > 5 || leng == 3 || leng == 4)) || 
     ((leng == 2 || leng == 5) && code !== 45) || /* only can hit a - for 3rd pos. */ 
      leng == 10) /* only want 10 characters "12-45-7890" */ 
     { 

     event.preventDefault(); 
     return; 
     } 

    }); 

Редакцией:

Пожалуйста, будьте осторожны с этим, я не в полной мере испытал это, но я редактировал регулярное выражение с поста упоминалось выше, если у вас есть это в дополнение к одному из других вариантов выше (это происходит при активации клавиатуры после того, как были сделаны другие проверки), это подтвердило бы дату в формате mm-dd-yyyy, пожалуйста, проверьте, что она работает правильно, я пробовал 02-29-2008, первый високосный год, о котором я мог думать, и это сработало, но я бы рекомендовал тестировать его больше, так как он был изменен.

$('input').on('keyup',function(e){ 

    /* From: 
    http://stackoverflow.com/questions/17503043/javascript-regular-expression-to-validate-date-in-mm-dd-yyyy-format 
    and 
    http://jsfiddle.net/LSsMc/ 
    */ 

    var thisVal = $(this).val(); 
    var leng = thisVal.length; 

    var reg = new RegExp(/^(((0[13578]|1[02])\-(0[1-9]|[12]\d|3[01])\-((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\-(0[1-9]|[12]\d|30)\-((19|[2-9]\d)\d{2}))|(02\-(0[1-9]|1\d|2[0-8])\-((19|[2-9]\d)\d{2}))|(02\-29\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g); 
    if(leng == 10){ 
    if(reg.test(thisVal)){ 
     console.log('Valid Date'); 
    }else { 
     event.preventDefault(); 
     return; 
    } 
    } 
}); 
+0

Привет @tbh__ я попробую ваш код.so Я могу задать вопрос позже. Спасибо – bumbumpaw

+0

Прохладный и просто FYI, это не мешает людям вставлять случайную строку в поле, но это не так. сфера охвата вопроса. –

+0

ваш код мне очень помогает, но есть ли способ добавить некоторую проверку действительной даты, високосного года и числа правых дней в месяц? Id, как и добавить для него регулярное выражение. – bumbumpaw

Смежные вопросы