You need to enable JavaScript to run this app. PHP如何校验用户输入是否符合「H:MM AM/PM, 时长MIN/HR」格式?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 11:45:06