PHP: Preg_match не работает, когда есть "/" - PullRequest
3 голосов
/ 12 января 2012

Этот убивает меня:

echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'downcom');

Этот печатает 0, потому что это неправильно.

echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'down.com');

Этот печатает 1, это правильно.

У меня вопрос: почему этот еще печатает 1.

echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'down.c/om');

Мне нужен мой домен проверки preg_match, только domain.com.Я не хочу, чтобы люди заходили на domain.com/asda, но он по-прежнему позволяет людям входить / даже я не устанавливаю / в [a-zA-Z0-9 -.] +

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Похоже, вам просто нужно добавить начальную и конечную границы ^, $:

echo preg_match("/^([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)$/",'down.c/om');
//---------------^^^--------------------------------^^^
// Prints 0

Причина, по которой вы потерпели неудачу, заключалась в том, что шаблон действительно соответствовал строке down.c, но, поскольку вы не указали конец строки $, никакие дополнительные символы не должны были соответствовать шаблону регулярного выражения, поэтому /om может быть проигнорировано. Включая $, вы заставляете тестовую строку соответствовать до конца.

1 голос
/ 12 января 2012

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

([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');
...