Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 25.10.2014, 04:07
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

Я было обрадовался с предыдущим вариантом, но накатав функцию превращения русских дат в timestamp понял что ошибки будут теперь выводится в фазе записи в БД, а надо чтоб в фазе валидации, то есть на 1 фазу раньше.
Ответить с цитированием
  #12 (permalink)  
Старый 25.10.2014, 06:38
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 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 - в самом низу
Ответить с цитированием
  #13 (permalink)  
Старый 25.10.2014, 11:20
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 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.
Ответить с цитированием
  #14 (permalink)  
Старый 25.10.2014, 11:57
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

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

Собственно оно текстовое именно потому что type="data" обсижен хромированными мухами. Я лично не собираюсь нацию переучивать на ISO8601, поэтому сделал type="text"
Ответить с цитированием
  #15 (permalink)  
Старый 25.10.2014, 12:06
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

kostyanet,
Ты ебанулся? Я сплитом просто массив сформировал, чтобы регуляркой по нему пройтись, проверить кусок твой сомнительный. Смотри UDP выше.
Ответить с цитированием
  #16 (permalink)  
Старый 25.10.2014, 12:19
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 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)])
Ответить с цитированием
  #17 (permalink)  
Старый 25.10.2014, 12:38
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

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

То есть пришлось-таки выводить эксепшн из фазы подготовки к записи.
Ответить с цитированием
  #18 (permalink)  
Старый 25.10.2014, 12:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Сообщение от kostyanet
Если юзер впишет 30 февраля 1987
Цитата:
вариант невозможности выбрать несуществующую дату
innerHTML....?
Ответить с цитированием
  #19 (permalink)  
Старый 25.10.2014, 12:52
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

kostyanet,
Сообщение от kostyanet
невозможно проверить практическими регами
Можно, если потрахаться, но не нужно. Будешь отсеивать 99% случаев, это уже хорошо. Идеально, как правило не надо.
Ответить с цитированием
  #20 (permalink)  
Старый 25.10.2014, 12:53
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хелп.Как получить ссылку без обрезания после & djdevil Общие вопросы Javascript 4 22.07.2014 13:48
Вывести изображение после ввода URL без перезагрузки страницы Delfiniys Элементы интерфейса 5 18.10.2013 11:41
array merge без замещения bugmenot Общие вопросы Javascript 7 15.11.2011 20:34
Удалить ряд символов перед или после курсора до определенного сивола brd Javascript под браузер 3 30.10.2009 08:20
evalScripts без regexp и eval Diem Events/DOM/Window 1 30.07.2009 17:34