Давайте разберем ваше регулярное выражение, чтобы увидеть, что оно делает:
([a-zA-Z0-9\-\.]+)
Эта первая часть говорит 1 или более из этих символов , что очень хорошо соответствует "вниз".
\.
Тогда мы сопоставляем одну точку.
([a-zA-Z0-9]+)
Затем мы сопоставляем 1 или более из этих символов. 'C' выполнил правило 1 или более , поэтому возвращает true. Если вы хотите точно соответствовать трем символам, измените свое регулярное выражение на что-то вроде:
echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]{3})/",'down.c/om');
Это должно вернуть false, как вы ожидаете. Совет Майкла о позиционной привязке (из его ответа) также полезен, хотя вы захотите убедиться, что входящие данные были обрезаны ($ может совпадать с \ n, как я узнал вчера). Вы также можете использовать модификатор D
или утверждение \z
, чтобы убедиться, что вы находитесь в конце строки. Вот как это может выглядеть при соединении:
echo preg_match("/^([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]{3})$/D",'down.c/om');