Проверка даты Неизвестная ошибка модификатора

Я использую эту строку для проверки поля даты в формате дд/мм/гггг и дд-мм-гггг:

'/^(0?[1-9]|[12][0-9]|3[01])[\/\.- ](0?[1-9]|1[0-2])[\/\.- ](19|20)\d{2}$/'

но я получаю эту ошибку

Предупреждение: preg_match() [function.preg-match]: неизвестный модификатор '\' в /var/www/...fields_lib.php в строке 102

Имейте в виду, что указанная выше строка вводится в дополнительное поле формы проверки веб-приложения без какого-либо разделителя, потому что я думаю, что форма сама включает разделители. Для других типов проверки, таких как целые и десятичные числа, мне пришлось удалить разделители, чтобы проверка работала в этой конкретной форме.

Любые идеи ?

Спасибо


person Mkgl    schedule 02.02.2011    source источник


Ответы (2)


Я не получаю эту ошибку; вместо этого я получаю сообщение об ошибке «диапазон не по порядку» по причине, указанной @CanSpice. Чтобы получить другую ошибку, мне нужно удалить первую обратную косую черту в классе символов ([/\.- ] вместо [\/\.- ]). Затем он интерпретирует / как разделитель регулярного выражения и ожидает, что следующий символ будет модификатором (например, i для без учета регистра или m для многострочного).

Таким образом, у вас есть две проблемы: - обрабатывается как оператор диапазона, а / обрабатывается как разделитель регулярных выражений. Вы можете справиться с обеими проблемами, экранируя недопустимые символы с помощью обратной косой черты (например, [\/.\- ]), но у каждой проблемы есть более элегантное решение. Если вы переместите - в первую или последнюю позицию, где он не может сформировать диапазон, он будет обработан как литерал -. Что касается /, вы можете использовать что-то еще для разделителя регулярных выражений. Например:

'~^(0?[1-9]|[12][0-9]|3[01])[/. -](0?[1-9]|1[0-2])[/. -](19|20)\d{2}$~'

К вашему сведению, от . вообще не нужно было убегать. В классах символов большинство метасимволов регулярных выражений теряют свое особое значение. Вы только что столкнулись с двумя особыми случаями. :-/

person Alan Moore    schedule 02.02.2011
comment
Со строкой, которую вы опубликовали, она теперь работает и проверяет поле. Большое спасибо. - person Mkgl; 03.02.2011

Вам не нужна обратная косая черта в классах символов, поэтому ваше регулярное выражение должно читать (частично) [/. -]. Также обратите внимание, что пробел и тире поменялись местами, потому что [.- ] будет интерпретироваться как «любой символ между . и .

person CanSpice    schedule 02.02.2011