25.10.2014, 04:07
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
При чем тут php. Из него валятся паттерны в атрибуты, а из атрибутов в js, поэтому приходится выбирать из подмножества совпадающих по лексике и логике.
Я было обрадовался с предыдущим вариантом, но накатав функцию превращения русских дат в timestamp понял что ошибки будут теперь выводится в фазе записи в БД, а надо чтоб в фазе валидации, то есть на 1 фазу раньше.
|
|
25.10.2014, 06:38
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Походу задробить, ну их нафиг эти названия, народ и так-то печатать не горазд, все равно числом вводить будет. Кроме того наконец-то дочитал мануал по php strtotime() которая, оказывается, понимает нашу нотацию просто по отсутствию американских косых. То есть 09/11/2001 - посчитает по-ихнему, а 11 09 2011, или 11.09.2001, 11-09-2001, 11\t09\t2001 - по-нашему.
Базовую регу натырил тут - http://www.regular-expressions.info/dates.html - в самом низу
|
|
25.10.2014, 11:20
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
Сообщение от kostyanet
|
То есть рега матчит дату 12 янв 1987
|
Вот это вроде работает
re=/^(янв|фев|мар|апр|мая|июн|июл|авг|сен|окт|ноя|дек)[а-яА-Я]{0,5}$/
arr="вмая ма января январряло февраля марта апреля мая июня июля августя сентября октября ноября декабря".split(" ")
arr.forEach(function(m){console.log(m, m.length, re.test(m))})
UPD полностью вот так попробуй, хотя полностью твою регулярку не проверял, хз
pat = /^(0[1-9]|[12][0-9]|3[01])[- .](янв|фев|мар|апр|мая|июн|июл|авг|сен|окт|ноя|дек)[а-яА-Я]{0,5}[- .](19|20)\d\d$/
s1="10 янв 1999"
s2="10 января 1999"
s3="10 январяяяяяяя 1999"
alert([pat.test(s1), pat.test(s2), pat.test(s3)])
console.log(s1.match(pat), s2.match(pat), s3.match(pat))
Последний раз редактировалось terminator-101, 25.10.2014 в 12:03.
|
|
25.10.2014, 11:57
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Да какой нах сплит, это же текстовое поле которое наравне с другими проверяется сугубо по им самим предоставленному паттерну. Ну то есть несколько более высокий уровень абстракции чем сплит.
Хера на месяцы текстом, в общем.
Собственно оно текстовое именно потому что type="data" обсижен хромированными мухами. Я лично не собираюсь нацию переучивать на ISO8601, поэтому сделал type="text"
|
|
25.10.2014, 12:06
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
kostyanet,
Ты ебанулся? Я сплитом просто массив сформировал, чтобы регуляркой по нему пройтись, проверить кусок твой сомнительный. Смотри UDP выше.
|
|
25.10.2014, 12:19
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
kostyanet,
Если числовой формат месяца еще нужен, то вроде так
pat = /^(0[1-9]|[12][0-9]|3[01])[- .](0[1-9]|1[012]|(янв|фев|мар|апр|мая|июн|июл|авг|сен|окт|ноя|дек)[а-яА-Я]{0,5})[- .](19|20)\d\d$/
s1="10 янв 1999"
s2="10 января 1999"
s3="10 11 1999"
s4="10 14 1999"
alert([pat.test(s1), pat.test(s2), pat.test(s3), pat.test(s4)])
|
|
25.10.2014, 12:38
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Не мучайтесь, дату все равно невозможно проверить практическими регами, даже если месяцы числами. Потому что некоторых дат внутри разрешенного диапазона не существует. Ну или придется регу молотить на пол-страницы, что выводит такую регу из диапазона практических.
Если юзер впишет 30 февраля 1987 то х ему а не открытка на ДР, он не рождался вообще!
То есть пришлось-таки выводить эксепшн из фазы подготовки к записи.
|
|
25.10.2014, 12:45
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,127
|
|
Сообщение от kostyanet
|
Если юзер впишет 30 февраля 1987
|
Цитата:
|
вариант невозможности выбрать несуществующую дату
|
innerHTML....?
|
|
25.10.2014, 12:52
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
kostyanet,
Сообщение от kostyanet
|
невозможно проверить практическими регами
|
Можно, если потрахаться, но не нужно. Будешь отсеивать 99% случаев, это уже хорошо. Идеально, как правило не надо.
|
|
25.10.2014, 12:53
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Разрешаю вам потрахаться.
|
|
|
|