PHP如何校验用户输入是否符合「H:MM AM/PM, 时长MIN/HR」格式?
PHP校验指定格式time输入的实现方法
核心校验思路
因为输入有严格的固定格式要求,最适合通过正则表达式做全量匹配,避免零散字符串判断漏过非法内容。
先拆解合法输入的规则边界:
- 时间部分:1-12点的无前置0小时 + 冒号 + 两位00-59范围的分钟 + 单个空格 + 大写的AM/PM标识
- 固定分隔符:时间部分结束后,必须接「逗号+单个空格」
- 时长部分:正整数的时长数值 + 单个空格 + 大写的HR/MIN单位
- 整个字符串不允许出现首尾多余字符、零散夹带的额外内容
匹配规则的正则表达式
根据上述规则,可直接使用的正则匹配规则为:/^([1-9]|1[0-2]):([0-5][0-9]) (AM|PM), ([0-9]+) (HR|MIN)$/
逐段对应匹配逻辑说明:
^、$:字符串首尾锚定,确保整个输入完全符合规则,不会放过前后夹带的非法字符([1-9]|1[0-2]):匹配无前置0的1-12点小时值,覆盖1-9点、10-12点的所有合法小时范围:([0-5][0-9]):匹配冒号后的两位分钟值,严格限定范围在00-59(AM|PM):匹配时间后单个空格加大写的AM/PM标识,:匹配AM/PM后固定的「逗号+空格」分隔符([0-9]+):匹配正整数的时长数值(HR|MIN):匹配时长后单个空格加大写的HR/MIN时间单位
完整PHP实现代码
<?php // 校验第一步:确认表单提交了time字段,且内容不为空 if (!isset($_POST['time']) || trim($_POST['time']) === '') { echo "请填写time字段内容"; exit; } // 清除输入内容两端的多余空格,避免用户误操作输入前后空白导致校验误判 $inputTime = trim($_POST['time']); // 定义校验规则 $checkPattern = '/^([1-9]|1[0-2]):([0-5][0-9]) (AM|PM), ([0-9]+) (HR|MIN)$/'; // 执行校验 $matchResult = []; if (preg_match($checkPattern, $inputTime, $matchResult) === 1) { // 校验通过,$matchResult 会自动拆分出所有结构化内容,可直接用于业务逻辑 // 拆分结果对应关系: // $matchResult[1] = 小时值(如8) // $matchResult[2] = 分钟值(如00) // $matchResult[3] = 上下午标识(AM/PM) // $matchResult[4] = 时长数值(如1) // $matchResult[5] = 时长单位(HR/MIN) echo "输入格式合法,提取到的结构化内容:" . print_r($matchResult, true); } else { // 校验不通过,返回格式提示 echo "输入格式不符合要求,请严格按照「H:MM AM/PM, 时长 单位MIN/HR」的格式填写,参考示例:8:00 AM, 1 HR"; } ?>
自动拦截的非法输入场景
这套规则会自动拦下所有不符合要求的输入,包括但不限于:
- 带前置0的小时值,如
08:00 AM, 1 HR - 分钟值位数不对、超出00-59范围的输入,如
8:5 AM, 1 HR、8:70 AM, 1 HR - 小写的上下午/单位标识,如
8:00 am, 1 hr - 缺失空格、分隔符的输入,如
8:00AM,1HR、8:00 AM,1HR - 超出1-12范围的小时值,如
13:00 PM, 2 HR - 前后夹带多余文字/符号的输入,如
预约时间:8:00 AM, 1 HR
内容的提问来源于stack exchange,提问作者ThaiThai
相关产品推荐
相关产品推荐

