PHP Динамическое Регулярное выражение? - PullRequest
0 голосов
/ 05 декабря 2009

Я относительно новичок в регулярных выражениях, но мне удалось создать рабочее выражение для проверки дат (без високосных годов и при условии, что люди вводят действительные 30 или 31 цифру в течение месяца).

Это выражение: /^\d[1-31]{2}\-\d[1-12]{2}\-\d[1900-2009]{4}$/

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

$yearSpan = (date("Y") - 110)."-".date("Y");
/^\d[1-31]{2}\-\d[1-12]{2}\-\d[$yearSpan]{4}$/

Когда я пытаюсь использовать это выражение, оно все время говорит мне, что компиляция не удалась, поскольку диапазон в классе символов вышел из строя.

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

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 05 декабря 2009

Я думаю, вам следует рассмотреть возможность использования некоторых функций даты / времени для этой цели.

Вы используете классы персонажей неправильно. [1-31], [1-12] и [1900-2009] не будут проверять диапазоны, которые у вас есть. Это не то, как классы символов работают, и, следовательно, это не то, как вы проверяете числовые диапазоны с помощью регулярных выражений.

Класс символов [a-r] соответствует любому символу от a до r. [a-rx] соответствует любому символу от a до r и символу x. Аналогичным образом, [1-39] соответствует любому символу от 1 до 3 и символу 9 - следовательно, он соответствует одному из 1,2,3 и 9 - а не любому числу от 1 до 39, как вы предполагали.

[1-31]{2} соответствует двум последовательным числам (последнее 1 является избыточным), оба в диапазоне от 1 до 3 - 33 является действительным соответствием.

Чтобы соответствовать числу от 1 до 31, правильное регулярное выражение - 0?[1-9]|[1-2][0-9]|3[0-1]. ('0?' Заботится о заполнении нулями, как в 01-09-2009

Для месяцев: 0?[1-9]|1[0-2]

Для года: 19[0-9]{2}|200[0-9]

И - не является метасимволом вне классов символов - вам не нужно избегать его.

Правильное регулярное выражение будет:

/^(0?[1-9]|[1-2][0-9]|3[0-1])-(0?[1-9]|1[0-2])-(19[0-9]{2}|200[0-9])$/

Если вы не заинтересованы в захвате значений, вы можете написать это как:

/^(?:0?[1-9]|[1-2][0-9]|3[0-1])-(?:0?[1-9]|1[0-2])-(?:19[0-9]{2}|200[0-9])$/
2 голосов
/ 05 декабря 2009

Вы можете сделать это с помощью функций даты и времени PHP http://php.net/manual/en/function.checkdate.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...