PHP регулярное выражение для проверки URL, filter_var слишком разрешающий - PullRequest
4 голосов
/ 06 сентября 2010

Сначала давайте определим «URL» в соответствии с моими требованиями.

Опционально допускаются только протоколы http:// и https://

, затем обязательное имя домена, например stackoverflow.com

затем, при необходимости, остальные компоненты URL (path, query, hash, ...)

Для справки список действительных и недействительных URL-адресов в соответствии с моими требованиями

VALID

INVALID

  • http://www (php filter_var разрешить это, да, я знаю, это valid url)
  • google
  • http://www. .des (php filter_var разрешить это)
  • Любой URL с недопустимыми символами в имени домена

Для полноты вот моя версия php: 5.3.2-1ubuntu4.2

Ответы [ 3 ]

3 голосов
/ 07 сентября 2010

В качестве отправной точки вы можете использовать эту для JS , но ее легко преобразовать в PHP preg_match.

/^(https?\://)?(www\.)?([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+[a-z]+$/i

Для PHP должно работать это:

$reg = '@^(https?\://)?(www\.)?([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+[a-z]+$@i';

Это регулярное выражение в любом случае проверяет только часть домена , но вы можете поработать над этим или разбить URL на 1-й слеш '/'(после "://") и проверьте отдельно доменную часть и остальные.

Кстати: это также подтвердит "http://www.domain.com.com", но это не ошибка, потому что URL субдомена может выглядеть так: "http://www.subdomain.domain.com" и этонедействителен!И почти нет способа (или, по крайней мере, нет простого способа) проверить правильность tld домена с помощью регулярного выражения , потому что вам нужно было бы встроить в свой regex все возможные tlds домена ONE BY ONE, как это:

/^(https?\://)?(www\.)?([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+(com|it|net|uk|de)$/i

(последний пример, например, будет проверять только домен, заканчивающийся на .com / .net / .de / .it / .co.uk). Новые tlds всегда выходят , так что вам придется корректировать каждое регулярное выражение, выходит новый tld, это боль в шее!

0 голосов
/ 06 сентября 2010

Может варьироваться, но в большинстве случаев вам не нужно проверять действительность любого URL.

Если это важная информация, и вы достаточно доверяете своему пользователю, чтобы он мог передать ее через URL, вы можете доверять ему достаточно, чтобы предоставить действительный URL.

Если это не важная информация, тогда вам просто нужно проверить попытки XSS и отобразить URL-адрес, который хотел пользователь.

Вы можете добавить вручную "http://", если вы его не обнаружили, чтобы избежать проблем с навигацией.


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

0 голосов
/ 06 сентября 2010

Вы можете использовать parse_url, чтобы разбить адрес на его компоненты.Хотя он явно не предназначен для проверки URL-адреса, анализ полученных компонентов и их соответствие вашим требованиям, по крайней мере, будет началом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...