javascript - 即时验证和修改时间输入

标签 javascript regex

在 Javascript 中,我如何使用正则表达式和 string.replace 函数验证和修改用户时间输入,这样它就不会告诉用户任何内容,而是验证和修改飞?

例如,用户输入可以是 1.12p 13:12 1,12PM,但最终结果应该始终是 下午 1:12

有没有人有关于如何这样做的例子?

附言。我知道使用 timepicker 是一种更有效的方式,但在这种情况下我必须使用用户输入

最佳答案

您可以使用一个简单的正则表达式作为起点:

(\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

您仍然需要验证时间是否有效(59:99 可能无效),但这至少可以更轻松地解析 javascript 中的字符串。解析后,您可以根据需要将其打印出来。

编辑:糟糕。忘记了 javascript 不支持命名组。只需使用编号组即可达到相同的效果。

示例
什么干草......这是一个完整的工作示例。何时验证(以及如何处理无效输入)由您决定:

<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>

输出:

Input Expected Actual
1:30 PM 1:30 PM 1:30 PM Success
1.30p 1:30 PM 1:30 PM Success
1;30a 1:30 AM 1:30 AM Success
59:99 PM null null Success
0,30 12:30 AM 12:30 AM Success
15:00 3:00 PM 3:00 PM Success
abc null null Success

关于javascript - 即时验证和修改时间输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13123766/

相关文章:

c# - 需要替换字符串中 anchor 标签的href

javascript - 通过 ids 匹配 2 个数组(用户[用户 id 作为键]到订单[订单 ids 数组的值])

javascript - 使用jquery鼠标无法在body中移动时出错?

javascript - 渲染 Ext.view.View 后调用函数

regex - 允许空字符串或具有特定长度的字符串的正则表达式

java - 用键值对分隔字符串

java - 如何匹配正则表达式中的整个标签?

javascript - 为 OpenLayers 转换 GPS 坐标

php - 无需刷新页面即可获取复选框值

java - 在 Java 中使用 Scanner 时,在一行中匹配标记时出现问题