我需要一个正则表达式来验证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'
来帮助,但不幸的是这并不是事实。