Проверка URL-адреса с протоколом или без него

Привет, я хотел бы проверить эти следующие URL-адреса, так что все они будут проходить с или без http / www-части в них, пока присутствует TLD, например .com, .net, .org и т. Д.

Допустимые URL должны быть:

http://www.domain.com http://domain.com https://www.domain.com https://domain.com www.domain.com domain.com 

Для поддержки длинных tlds:

 http://www.domain.com.uk http://domain.com.uk https://www.domain.com.uk https://domain.com.uk www.domain.com.uk domain.com.uk 

Для поддержки тире (-):

 http://www.domain-here.com http://domain-here.com https://www.domain-here.com https://domain-here.com www.domain-here.com domain-here.com 

Также для поддержки номеров в доменах:

 http://www.domain1-test-here.com http://domain1-test-here.com https://www.domain1-test-here.com https://domain1-test-here.com www.domain1-test-here.com domain-here.com 

Также возможно разрешить даже IP-адреса:

 127.127.127.127 

(но это дополнительно!)

Также разрешите тире (-), забыл о том, что =)

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

Related of "Проверка URL-адреса с протоколом или без него"

Для правильной проверки правильности URL.

Выше ответ прав, но не работает во всех доменах, таких как .me, .it, .in

поэтому, пожалуйста, ниже, для URL-адреса:

 $pattern = '/(?:https?:\/\/)?(?:[a-zA-Z0-9.-]+?\.(?:[a-zA-Z])|\d+\.\d+\.\d+\.\d+)/'; if(preg_match($pattern, "http://website.in")) { echo "valid"; }else{ echo "invalid"; } 

Когда вы игнорируете часть пути и ищете только часть домена, простое правило будет

 (?:https?://)?(?:[a-zA-Z0-9.-]+?\.(?:com|net|org|gov|edu|mil)|\d+\.\d+\.\d+\.\d+) 

Если вы хотите также поддерживать TLD страны, вы должны либо предоставить полный (текущий) список, либо добавить |.. в часть ДВУ.

С preg_match вы должны обернуть его между некоторыми разделителями

 $pattern = ';(?:https?://)?(?:[a-zA-Z0-9.-]+?\.(?:com|net|org|gov|edu|mil)|\d+\.\d+\.\d+\.\d+);'; $index = preg_match($pattern, $url); 

Обычно вы используете / . Но в этом случае косые черты являются частью шаблона, поэтому я выбрал другой разделитель. В противном случае я должен убежать с косой чертой с \

 $pattern = '/(?:https?:\/\/)?(?:[a-zA-Z0-9.-]+?\.(?:com|net|org|gov|edu|mil)|\d+\.\d+\.\d+\.\d+)/'; 

Я думаю, вы можете использовать флаги для filter_vars .

Для FILTER_VALIDATE_URL доступно несколько флагов:

  • FILTER_FLAG_SCHEME_REQUIRED Требуется, чтобы URL-адрес содержал часть схемы.
  • FILTER_FLAG_HOST_REQUIRED Требуется, чтобы URL-адрес содержал главную часть.
  • FILTER_FLAG_PATH_REQUIRED Требуется, чтобы URL-адрес содержал часть пути.
  • FILTER_FLAG_QUERY_REQUIRED Требуется, чтобы URL-адрес содержал строку запроса.

FILTER_FLAG_SCHEME_REQUIRED и FILTER_FLAG_HOST_REQUIRED используются по умолчанию.

Допустим, вы хотите проверить часть пути и не хотите проверять часть схемы, вы можете сделать что-то вроде этого (falg – это битовая маска):

 filter_var($url, FILTER_VALIDATE_URL, ~FILTER_FLAG_SCHEME_REQUIRED | FILTER_FLAG_PATH_REQUIRED) 

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

Не пишите свой собственный валидатор URL. Проверка правильности URL является решаемой проблемой, и существует уже существующий код, который уже был написан, отлажен и тестирован. На самом деле, он поставляется с PHP.

Посмотрите встроенную функцию фильтрации PHP: http://us2.php.net/manual/en/book.filter.php