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
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. : \ –
Niestety pracuję z jakimś naprawdę starym źródłem, które nie używa nawet jQuery, nie mówiąc już o HTML5. – Victor
Czy znalazłeś już rozwiązanie? – JDB