2012-10-29 7 views
5

W języku Javascript, w jaki sposób można sprawdzić i zmodyfikować wprowadzanie czasu użytkownika za pomocą wyrażenia regularnego i funkcji string.replace, tak aby zamiast informować użytkownika o wszystkim, będzie on sprawdzać i modyfikować dane wejściowe w locie ?Sprawdzanie poprawności i modyfikowanie wprowadzania czasu w locie

Na przykład wprowadzeniem użytkownika może być 1.12p13:121,12PM, ale ostateczny wynik powinien zawsze wynosić 1:12 PM.

Czy ktoś ma przykłady, jak to zrobić?

PS. Wiem, że za pomocą timepicker to sposób bardziej efektywny sposób, ale mam do korzystania z danych wprowadzonych przez użytkownika w tym przypadku

+1

nie mam dla ciebie odpowiedź, ale mam kilka rad. Szukając metody, aby to zrobić i jeśli możesz obsługiwać HTML5, użyj [input DOM event] (https://developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/input) i dla miłości ze wszystkich rzeczy uroczych i puszystych, nie używaj wydarzeń z kluczami kluczowymi i keydown. spowodują ból głowy po bólu głowy. To wszystko, jeśli niestety możesz obsługiwać HTML5. : \ –

+0

Niestety pracuję z jakimś naprawdę starym źródłem, które nie używa nawet jQuery, nie mówiąc już o HTML5. – Victor

+0

Czy znalazłeś już rozwiązanie? – JDB

Odpowiedz

1

Proste regex można użyć jako punktu wyjścia:

(\d{1,2})\s*[.,:;]\s*(\d{1,2})\s*(([Aa]|[Pp])[Mm]?)? 
^  ^^ ^^  ^^^  ^
Hour group |  | Minutes | | |   M is optional 
     | Valid separators | | Case-insensitivity 
     |  |   | AM/PM group 
     ------------------------------Allow spaces 

you” d wciąż musi potwierdzić, że czas jest ważny (prawdopodobnie 59:99 jest niepoprawny), ale to przynajmniej ułatwiłoby analizę łańcucha w javascript. Po przeanalizowaniu go możesz go wydrukować, jak chcesz.

EDYCJA: Ups. Zapomniałem, że javascript nie obsługuje nazwanych grup. Wystarczy użyć ponumerowanych grup, aby uzyskać ten sam efekt.

Przykład
Co siano ... tutaj jest pełna przykładów pracy. Kiedy do sprawdzania poprawności (i co zrobić z nieprawidłowym wejściu) jest pozostawione do Ciebie:

<html> 
    <head> 
     <script> 
function parseTime(timeString){ 
    var timePattern = /(\d{1,2})\s*[.,:;]\s*(\d{1,2})\s*(([Aa]|[Pp])[Mm]?)?/; 
    var timeMatch = timePattern.exec(timeString); 

    var INVALID = null; 

    if (timeMatch !== null){ 
     var hour = timeMatch[1]; 
     var minute = timeMatch[2]; 
     var ampm = timeMatch[3]; 

     if (minute < 0 || minute > 59) 
      return INVALID; 

     if (ampm != ""){ 
      if (hour < 1 || hour > 12) 
       return INVALID; 

      ampm = ampm.substring(0,1).toUpperCase() == "A" ? "AM" : "PM"; 
     } else { 
      if (hour > 23) 
       return INVALID; 

      ampm = (hour < 13 ? "AM" : "PM"); 
      hour = hour % 12; 
      if (hour == 0) hour = 12; 
     } 

     return hour + ":" + minute + " " + ampm; 
    } else { 
     return INVALID; 
    } 
} 

function unitTest(){ 
    var testStrings = [ 
     ["1:30 PM", "1:30 PM"], 
     ["1.30p", "1:30 PM"], 
     ["1;30a", "1:30 AM"], 
     ["59:99 PM", null], 
     ["0,30", "12:30 AM"], 
     ["15:00", "3:00 PM"], 
     ["abc", null] ]; 

    var testResults; 
    testResults = "<table><tr><th>Input</th><th>Expected</th><th>Actual</th></tr>"; 

    for (var i = 0; i < testStrings.length; i++){ 
     testResults += 
      "<tr>" + 
       "<td>" + testStrings[i][0] + "</td>" + 
       "<td>" + testStrings[i][1] + "</td>" + 
       "<td>" + parseTime(testStrings[i][0]) + "</td>" + 
       "<td>" + (testStrings[i][1] == parseTime(testStrings[i][0]) ? 
          "<span style='color:green'>Success</span>" : 
          "<span style='color:red'>Failure</span>") + 
       "</td>" + 
      "</tr>"; 
    } 

    testResults += "</table>"; 

    this.document.getElementById("results").innerHTML = testResults; 
} 
     </script> 
    </head> 
    <body onload="unitTest();"> 

     <div id="results"> 
     </div> 

    </body> 
</html> 

wyjściowa:

Wejście Oczekiwany Rzeczywista
13:30 13:30 1: 30 pM Sukces
1.30p 13:30 13:30 Sukces
1; 30a 01:30 01:30 59:99 sukces
PM zerowy zerowy Sukces
0,30 00:30 12: 3 0 AM Sukces
15:00 15:00 15:00 Sukces
abc null null Sukces

+0

Zaktualizowałem moją odpowiedź na przykładzie roboczym. – JDB

Powiązane problemy