Мне нужно регулярное выражение для проверки длительности в формате ISO 8601 (за исключением дробные части, которые мне не нужны).
ПнЙнМнДТнХнМнС
ПНВ
Вот что у меня есть:
^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'
в элементе ввода, чтобы помочь, но, к сожалению, это не так.
^(?=.{3,}$)P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$
. - person Wiktor Stribiżew   schedule 17.08.2015P4DT
все еще можно ввести. Также есть причина для понижения? - person rink.attendant.6   schedule 17.08.2015P
иPT
. Я отредактировал, чтобы уточнить, пожалуйста, дайте мне знать, если я могу добавить что-нибудь еще. - person rink.attendant.6   schedule 17.08.2015