Регулярное выражение для сопоставления дат в формате ГГГГ-ММ-ДД - PullRequest
0 голосов
/ 11 ноября 2009

У меня есть регулярное выражение в PHP, которое ищет дату в формате ГГГГ-ММ-ДД

Что у меня есть: [\d]{4}-[\d]{2}-[\d]{2}

Я использую preg_match для проверки даты, проблема в том, что 2009-11-10 работает, но 2009-11-1033434 также работает. Прошло некоторое время с тех пор, как я сделал регулярное выражение, как мне убедиться, что он останавливается в правильном месте? Я пытался сделать /([\d]{4}-[\d]{2}-[\d]{2}){1}/, но он возвращает тот же результат.

Любая помощь будет принята с благодарностью.

Ответы [ 7 ]

9 голосов
/ 11 ноября 2009

Вам нужны якоря, в частности ^ и $. Первый соответствует началу строки, второй соответствует концу.

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

Итак, ваше регулярное выражение должно выглядеть так: /^\d{4}-\d{2}-\d{2}$/.

3 голосов
/ 28 марта 2016
^20[0-2][0-9]-((0[1-9])|(1[0-2]))-([0-2][1-9]|3[0-1])$

Я добавил небольшую дополнительную проверку, чтобы помочь с путаницей MM и DD пользователя. Это не охватывает все смешанные даты, но сохраняет часть YYYY между 2000 и 2029, MM между 01 и 12 и DD между 01 и 31

3 голосов
/ 11 ноября 2009

Как вы ожидаете, что ваша дата будет прервана?

Если конец строки, то следующий $ должен сделать трюк.

Если для нецифрового символа, то следующее отрицательное утверждение (?!\d) будет работать аналогично.

1 голос
/ 11 ноября 2009

Вы, вероятно, хотите заглянуть в будущее (если ваш движок поддерживает их, php / preg / pcre поддерживает)

Предварительные утверждения (или положительные утверждения) позволяют вам сказать «и после него должен стоять X, но X не должен быть частью совпадения). Попробуйте следующий синтаксис

\d{4}-\d{2}-\d{2}(?=[^0-9])

Утверждение это часть

(?=[^0-9])

Он говорит "после моего регулярного выражения, следующий символ не может быть числом"

Если это не дает вам того, что вы хотите / нужно, опубликуйте пример своего ввода и вашего PHP-кода, который не работает. Эти два элемента могут быть чрезвычайно полезны при устранении подобных проблем.

1 голос
/ 11 ноября 2009

[\d]{4}-[\d]{2}-[\d]{2}?

, где знак вопроса означает «не жадный»

1 голос
/ 11 ноября 2009

вы, вероятно, хотите поставить якоря на выражение. т.е.

^[\d]{4}-[\d]{2}-[\d]{2}$

обратите внимание на каретку и знак доллара.

0 голосов
/ 11 ноября 2009

Вы можете попробовать поместить оба символа '^' и '$' в начале и конце вашего выражения:

/^[\d]{4}-[\d]{2}-[\d]{2}$/

, которые соответствуют началу и концу строки соответственно.

...