Я хочу проверить, имеет ли строка следующий формат
У меня есть это регулярное выражение
^\d{6,8}(-\d{4})?$
Но тогда я застрял. Я действительно новичок в регулярном выражении. Могу я получить помощь или подсказки?
пока мне не нужно проверять правильность месяцев и т. д. Итак, 111111-1111 правильный.
Как насчет того, чтобы вместо этого анализировать даты как даты? php.net/manual/en/datetime.createfromformat.php
Если какой-либо из ответов помог решить вашу проблему, отметьте один, чтобы вопрос можно было решить.






Сделайте - необязательным, и ваше регулярное выражение будет работать:
^\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}, потому что дефис должен быть там в соответствии с необязательной группой.
Если вы хотите сопоставить свои значения без каких-либо групп захвата, вы можете сделать только тире необязательным ?
Это будет соответствовать
Это сложнее, чем вы думаете. Например, месяц может быть от 01 до 12, а не двумя произвольными цифрами.