Regex для проверки действительного числа в формате PHP

Я хочу проверить, имеет ли строка следующий формат

  1. ГГММДД-ХХХХ
  2. ГГГГММДД-ХХХХ
  3. ГГММДДХХХХ
  4. ГГГГММДДXXXX

У меня есть это регулярное выражение

^\d{6,8}(-\d{4})?$

Но тогда я застрял. Я действительно новичок в регулярном выражении. Могу я получить помощь или подсказки?

Это сложнее, чем вы думаете. Например, месяц может быть от 01 до 12, а не двумя произвольными цифрами.

user4035 29.05.2018 21:28

пока мне не нужно проверять правильность месяцев и т. д. Итак, 111111-1111 правильный.

mohsinali1317 29.05.2018 21:31

Как насчет того, чтобы вместо этого анализировать даты как даты? php.net/manual/en/datetime.createfromformat.php

Sammitch 29.05.2018 21:32

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

user3783243 07.06.2018 04:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
139
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Сделайте - необязательным, и ваше регулярное выражение будет работать:

^\d{6,8}(-?\d{4})?$

https://regex101.com/r/uoF1HM/1/

Это также будет соответствовать многим числовым форматам. Строки вашего примера выглядят как даты, в этом случае я бы использовал что-то более строгое (или уже написанное, например, https://stackoverflow.com/a/14566624/3783243 может быть хорошим местом для начала).

Ответ принят как подходящий

Вы можете использовать эту функцию:

function checkFunc($value){
  if (preg_match('/^[0-9]{6,8}(-?)[0-9]{4}$/', $value)) {
    //is valid
     return $value;
  } else {
    //is invalid
    return false;
 }
}

echo checkFunc("20180529-4444"); //20180529-4444

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

В вашем регулярном выражении ^\d{6,8}(-\d{4})?$ у вас есть необязательная группа (-\d{4})? с дефисом внутри группы. Это означает, что вы можете сопоставить только такой формат, как \d{6,8} или с дефисом \d{6,8}-\d{4}, но не \d{6,8}\d{4}, потому что дефис должен быть там в соответствии с необязательной группой.

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

Это будет соответствовать

  • ^ Утвердить позицию в начале строки
  • \d{6,8} Match 6-8 цифр
  • -? Соответствие дополнительному тире
  • \d{4} Соответствие 4 цифрам
  • $ Утвердить позицию в конце строки

    ^\d{6,8}-?\d{4}$

Другие вопросы по теме