Regex para durações ISO 8601
Eu preciso de uma expressão regular para validar durações noFormato de duração ISO 8601 (com exceção das partes fracionárias das quais não preciso).
PnYnMnDTnHnMnS
PnW
Aqui está o que eu tenho:
^P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$
O único problema é que as cordasP
ePT
são permitidos com este regex, pois todas as partes são "zero ou uma"?
.
T
é necessário que haja um componente de tempo (H, M ou S)Se houver umT
pode haver ou não componentes de data (Y, M ou D)O estouro é permitido (por exemplo,P72H
é principalmente equivalente aP3D
)Entradas aceitáveis:
P1Y // date component only
P2MT30M // date and time components
PT6H // time component only
P5W // another date component
Entradas inaceitáveis:
P // no components
PT // no components
P3MT // T specified but not time components
No momento, as cadeias inválidas estão passando pela validação do lado do cliente, mas falham no lado do servidor porque são passadas paraDateInteval
mas eu gostaria de falhar no lado do cliente, se possível. Se todo mundo estivesse usando o Chrome 40 ou superior, eu poderia especificarminlength='3'
no elemento de entrada para ajudar, mas esse não é o caso, infelizmente.