Я пытаюсь проверить даты, такие как DD / MM / YYYY с PHP, используя preg_match (). Вот как выглядит выражение REGEX:
$pattern = "/^([123]0|[012][1-9]|31)/(0[1-9]|1[012])/(19[0-9]{2}|2[0-9]{3})$/";
Но используя его с правильным значением, я получаю это сообщение: preg_match (): Неизвестный модификатор '('
Полный код:
$pattern = "/^([123]0|[012][1-9]|31)/(0[1-9]|1[012])/(19[0-9]{2}|2[0-9]{3})$/"; $date = "01/03/2011"; if(preg_match($pattern, $date)) return TRUE;
заранее спасибо
Избегайте /
символов внутри выражения как \/
.
$pattern = "/^([123]0|[012][1-9]|31)\/(0[1-9]|1[012])\/(19[0-9]{2}|2[0-9]{3})$/";
Как отмечали другие ответы, лучше использовать другой разделитель, который не используется в выражении, например ~
чтобы избежать эффекта «наклонных зубочисток», который затрудняет его чтение.
ваш разделитель есть /, но вы используете его внутри самого шаблона. Используйте другой разделитель или выйдите из /
Вы используете /
как разделитель, а также в своем выражении. Теперь
/^([123]0|[012][1-9]|31)/
Является ли «полное» выражение, и все последующие ожидаются как модификатор, также (
.
Вы можете просто использовать другой разделитель.
~^([123]0|[012][1-9]|31)/(0[1-9]|1[012])/(19[0-9]{2}|2[0-9]{3})$~
Или вы избегаете всего присутствия /
внутри выражения, но я бы предпочел другой разделитель;) Его более читаемый.
Вы могли бы избежать косой черты /
как было предложено. Тем не менее, это в конечном итоге приведет к Leaning Toothpick Syndome .
Обычно для разглаживания регулярных выражений используются разные разделители:
// Using "=" as delimiter preg_match('=^ ... / ... $=', $input);
checek date, используя функцию ниже
function checkDateFormat($date) { //match the format of the date if (preg_match ("/^([0-9]{2}) \/([0-9]{2})\/([0-9]{4})$/", $date, $parts)) { //check weather the date is valid of not if(checkdate($parts[2],$parts[1],$parts[3])) return true; else return false; } else return false; } echo checkDateFormat("29/02/2008"); //return true echo checkDateFormat("29/02/2007"); //return false