Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Регулярное выражение для проверки года


Автор: Kuznec 27.10.2013, 14:05
Есть задача проверять год Зимних Олимпийских игр начиная с 2000 года и по текущий + 4 года вперёд. Т.е. выражение должно пропускать только 2002, 2006, 2010 и 2014 года. Есть ли возможность делать такую проверку с помощью регулярного выражения?

Автор: AVA12 27.10.2013, 15:20
Цитата
выражение должно пропускать только 2002, 2006, 2010 и 2014 года

/2002|2006|2010|2014/

Автор: Kuznec 27.10.2013, 15:38
Цитата(AVA12 @  27.10.2013,  15:20 Найти цитируемый пост)
/2002|2006|2010|2014/ 


Не, это не годится, это для примера использовалась начальная дата 2000, а если брать ранние, то выражение ещё растянется. Почитал ещё раз регулярные выражения, так сказать, освежить данные, видимо циклы там всё-таки не предусмотрены.

Надо что-то своё придумывать универсальное для фильтрации данных.

Автор: ksnk 27.10.2013, 22:51
Код

'/20(?:[02468][048]|[13579][26])/'

Автор: baldina 28.10.2013, 10:18
имхо не для регулярки задача.
Код

$year = '2014';
$sog_year = (1896 <= $year) && ($year%4 == 0);
$wog_year = ((1924 <= $year && $year <= 1992) && ($year%4 == 0)) ||
                      ((1994 <= $year) && (($year+2)%4 == 0)) ;

Автор: ksnk 28.10.2013, 12:52
baldina, 
Цитата(Kuznec @  27.10.2013,  14:05 Найти цитируемый пост)
Есть задача проверять год Зимних Олимпийских игр начиная с 2000 года и по текущий + 4 года вперёд

для  такой постановки - вполне для регулярки. Хотя у меня, как оказалось - летние олимпийские игры :(

зимние вот так:
Код

'/20(?:[02468][26]|[13579][048])/'

Автор: baldina 28.10.2013, 14:40
я тоже не заметил сразу.
зато регулярка красивая ;-)

Цитата(ksnk @  28.10.2013,  12:52 Найти цитируемый пост)
для  такой постановки

Цитата(Kuznec @  27.10.2013,  15:38 Найти цитируемый пост)
это для примера использовалась начальная дата 2000, а если брать ранние

кто знает, что понадобится. а в общем случае регуляркой громоздко

Автор: Kuznec 28.10.2013, 18:21
Цитата(ksnk @  28.10.2013,  12:52 Найти цитируемый пост)
для  такой постановки - вполне для регулярки.


В общем-то, смысл то понятен вашего выражения, но, в таком случае, оно пропустит дату 2022, а требуется проверка до 2013+4 = 2017, т.е. только 2014 год пропускать. Но, всё равно спасибо за предложенный вариант - не ожидал, что так можно. С прошлым веком, видимо, нужно ещё дополнительно дописывать.

 
Цитата(baldina @  28.10.2013,  10:18 Найти цитируемый пост)
имхо не для регулярки задача.


К сожалению, да. Думал, что есть там какие-нибудь циклы, т.к. этот вопрос на 100% не штудировал. Но, и решение задачи программой (PHP, JS) тоже не подходит, в том смысле, что нужны какие-то универсальные фильтры, записываемые примерно как регулярное выражение. Получается, что для этого необходимо ввести понятие цикла и понятие даты, а также понятие элементарные вычисление (+, -, *, /).

Автор: baldina 28.10.2013, 18:53
Цитата(Kuznec @  28.10.2013,  18:21 Найти цитируемый пост)
решение задачи программой (PHP, JS) тоже не подходит

Цитата(Kuznec @  28.10.2013,  18:21 Найти цитируемый пост)
универсальные фильтры


не очень понятно что мешает использовать PHP и JS (ввиду ветки "PHP: общие вопросы"). Если это фильтр для запроса к БД, то там это тоже решаемо выражением.

В общем уточните как это будет применяться, а народ что-нить посоветует.

Добавлено через 52 секунды
Цитата(Kuznec @  28.10.2013,  18:21 Найти цитируемый пост)
для этого необходимо ввести понятие цикла

это как раз лишнее

Автор: Kuznec 28.10.2013, 20:43
Цитата(baldina @  28.10.2013,  18:53 Найти цитируемый пост)
В общем уточните как это будет применяться


Основная задача выглядит следующим образом.

Формируются объекты. Объектами могут выступать обычные страницы сайта (к примеру), человек, дом, школа и бесконечное множество реальных объектов. У каждого объекта, соответственно, есть свои свойства. Каждый объект имеет свой шаблон. И в этом шаблоне необходимо прописать фильтры. Если за объект взять Олимпийские игры, то в качестве свойства может выступать название города, где они проводились, год и т.д. Соответственно, необходимо правильно вписывать года, к примеру. Но, фильтр формировать должен не программист, а обычный пользователь, знающий, так сказать. Прогу пихать точно не айс, выражение должно храниться в БД в виде строки.

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

Были мысли применения и программ, но это крайний случай, если не получится вариант обычной строки. 


Цитата(baldina @  28.10.2013,  18:53 Найти цитируемый пост)
это как раз лишнее 

Возможно... 

Автор: baldina 29.10.2013, 00:28
Цитата(Kuznec @  28.10.2013,  20:43 Найти цитируемый пост)
Формируются объекты.

это не задача, а попытка решения какой-то задачи, некое проектное решение. но допустим. 
решение наделить объекты свойствами, из которых вытекает поведение объектов - это перекладывание из одного места в другое: налицо желание оградить кого-то или чего-то от программирования, оставив возможность программирования.
если объекты не классифицированы на типы, и эти типы не снабжены алгоритмами поведения на исходном языке, то такая попытка приводит в итоге к  (неосознанному) созданию языка программирования.
пользователю системы, у которого есть лишь средства задания статических данных, хранящихся в БД, достается трудно понимаемый и управляемый способ. например, таким способом трудно задавать ограничения на свойства, связанные с другими свойствами. скажем, если Олимпийские игры должны в качестве атрибутов иметь страну и город, как обеспечить согласованность страны и города?
итого: если отказываться от классификации объектов, проще и логичнее иметь возможность добавлять не только статичные свойства, но и код.
попытка привлечь регулярные выражения - шаг естественный, но этот способ не сможет решить любую задачу.

Добавлено через 4 минуты и 54 секунды
это немного похоже на изобретение шаблонизатора на php: если кто-то готов изучить богатый синтаксис шаблонизатора, ему и php изучить не сложно. а php сам себе вполне шаблонизатор. так что если есть смысл что-то создавать, то это будет специализированная библиотека.

Добавлено через 6 минут и 52 секунды
конечно, может быть желание создать предметно-ориентированный язык, но это требует совсем иных подходов и затрат.

Добавлено через 11 минут и 8 секунд
что именно предлагаю в данном случае:
создайте предопределенные типы объектов или хотя бы полей. поле типа "регулярное выражение". поля типа "страна", "город", "олимпийский год". в более общем виде - поле типа "ссылка на значение справочника": таким справочником может быть таблица со списком олимпийских лет, городов и т.д.

Автор: Kuznec 30.10.2013, 13:26
Подумал, подумал я, и решил, что будут использоваться заранее созданные настраиваемые фильтры, и по мере необходимости будут дополняться. В общем виде, для года настройки будут выглядеть так:

начало периода (смещение), конец периода (смещение), шаг

начало и конец периода может быть фиксированная дата, либо задаваться от текущей с использованием смещения. Т.е. в нашем случае начало периода 2002 (фиксированное число), конец периода текущая дата + смещение +4, и шаг 4.

В таком случае, данный фильтр будет человеку понятен и не нужно изучать регулярки и т.д., и никакого программирования в виде завуалированного кода. Только задача усложняется тем, что все эти фильтры и настройки должны именть однотипную структуру для организованного хранения над чем и нужно подумать теперь.

Цитата(baldina @  29.10.2013,  00:28 Найти цитируемый пост)
создайте предопределенные типы объектов или хотя бы полей. поле типа "регулярное выражение". поля типа "страна", "город", "олимпийский год". в более общем виде - поле типа "ссылка на значение справочника": таким справочником может быть таблица со списком олимпийских лет, городов и т.д. 


Получается, что-то типа этого.

Автор: baldina 30.10.2013, 14:00
Цитата(Kuznec @  30.10.2013,  13:26 Найти цитируемый пост)
фильтры и настройки должны именть однотипную структуру для организованного хранения

их можно хранить как одну строку, т.к. бд читать и писать будет не человек, а скрипт

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)