Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   После new RegExp null, а без new RegExp array (https://javascript.ru/forum/misc/51101-posle-new-regexp-null-bez-new-regexp-array.html)

kostyanet 25.10.2014 04:07

При чем тут php. Из него валятся паттерны в атрибуты, а из атрибутов в js, поэтому приходится выбирать из подмножества совпадающих по лексике и логике.

Я было обрадовался с предыдущим вариантом, но накатав функцию превращения русских дат в timestamp понял что ошибки будут теперь выводится в фазе записи в БД, а надо чтоб в фазе валидации, то есть на 1 фазу раньше.

kostyanet 25.10.2014 06:38

Походу задробить, ну их нафиг эти названия, народ и так-то печатать не горазд, все равно числом вводить будет. Кроме того наконец-то дочитал мануал по php strtotime() которая, оказывается, понимает нашу нотацию просто по отсутствию американских косых. То есть 09/11/2001 - посчитает по-ихнему, а 11 09 2011, или 11.09.2001, 11-09-2001, 11\t09\t2001 - по-нашему.

Базовую регу натырил тут - http://www.regular-expressions.info/dates.html - в самом низу

terminator-101 25.10.2014 11:20

Цитата:

Сообщение от 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))

kostyanet 25.10.2014 11:57

Да какой нах сплит, это же текстовое поле которое наравне с другими проверяется сугубо по им самим предоставленному паттерну. Ну то есть несколько более высокий уровень абстракции чем сплит.

Хера на месяцы текстом, в общем.

Собственно оно текстовое именно потому что type="data" обсижен хромированными мухами. Я лично не собираюсь нацию переучивать на ISO8601, поэтому сделал type="text"

terminator-101 25.10.2014 12:06

kostyanet,
Ты ебанулся? Я сплитом просто массив сформировал, чтобы регуляркой по нему пройтись, проверить кусок твой сомнительный. Смотри UDP выше.

terminator-101 25.10.2014 12:19

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)])

kostyanet 25.10.2014 12:38

Не мучайтесь, дату все равно невозможно проверить практическими регами, даже если месяцы числами. Потому что некоторых дат внутри разрешенного диапазона не существует. Ну или придется регу молотить на пол-страницы, что выводит такую регу из диапазона практических.

Если юзер впишет 30 февраля 1987 то х ему а не открытка на ДР, он не рождался вообще!

То есть пришлось-таки выводить эксепшн из фазы подготовки к записи.

рони 25.10.2014 12:45

Цитата:

Сообщение от kostyanet
Если юзер впишет 30 февраля 1987

Цитата:

вариант невозможности выбрать несуществующую дату
http://javascript.ru/forum/dom-windo...tml#post263897

terminator-101 25.10.2014 12:52

kostyanet,
Цитата:

Сообщение от kostyanet
невозможно проверить практическими регами

Можно, если потрахаться, но не нужно. Будешь отсеивать 99% случаев, это уже хорошо. Идеально, как правило не надо.

kostyanet 25.10.2014 12:53

Разрешаю вам потрахаться.


Часовой пояс GMT +3, время: 18:02.