我需要一个正则表达式来验证ISO 8601 持续时间格式的持续时间(我不需要的小数部分除外)。
PnYnMnDTnHnMnS
PNW
这是我所拥有的:
^P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$
唯一的问题是这个正则表达式允许使用字符串P
和PT
,因为所有部分都是“零或一” ?
。
- 至少需要一个组件(日期或时间)
- 如果有,
T
则需要有一个时间分量(H、M 或 S) - 如果有,
T
那么可能有也可能没有任何日期组件(Y、M 或 D) - 允许溢出(例如
P72H
,主要等同于P3D
)
可接受的输入:
P1Y // date component only
P2MT30M // date and time components
PT6H // time component only
P5W // another date component
不可接受的输入:
P // no components
PT // no components
P3MT // T specified but not time components
现在,无效字符串正在通过客户端验证,但在服务器端失败,因为它已被传递,DateInteval
但如果可能的话,我希望在客户端失败。如果每个人都使用 Chrome 40+,我可以minlength='3'
在输入元素上指定以提供帮助,但不幸的是情况并非如此。