Ответ 1

Да, есть! Использовать filter_var:

if (filter_var($url, FILTER_VALIDATE_URL) !== false) ...

FILTER_VALIDATE_URL проверяет URL-адреса в соответствии с RFC 2396.

Ответ 2

Хорошо, если мы посмотрим на RFC 3986, мы сможем найти определение URL-адреса.

И если мы рассмотрим Приложение B, есть руководство по использованию регулярных выражений для анализа URL-адреса:

Приложение B. Разбор ссылок на URI с регулярным выражением

Поскольку алгоритм "first-match-wins" идентичен "жадному",
метод неоднозначности, используемый регулярными выражениями POSIX,
естественным и обычным для использования регулярного выражения для синтаксического анализа
потенциальные пять компонентов ссылки URI.

Следующая строка - это регулярное выражение для разложения
хорошо сформированный ссылочный код URI в его компоненты.

  ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
   12            3  4          5       6  7        8 9

Цифры во второй строке выше предназначены только для удобства чтения; они указывают контрольные точки для каждого подвыражения (т.е. каждая спаренная скобка). Мы ссылаемся на значение, сопоставляемое для подвыражения как $. Например, сопоставление указанного выражения с

  http://www.ics.uci.edu/pub/ietf/uri/#Related

приводит к следующим подвыражениям:

  $1 = http:
  $2 = http
  $3 = //www.ics.uci.edu
  $4 = www.ics.uci.edu
  $5 = /pub/ietf/uri/
  $6 = <undefined>
  $7 = <undefined>
  $8 = #Related
  $9 = Related

где указывает, что компонент отсутствует, как это имеет место для компонента запроса в приведенном выше примере. Поэтому мы можем определить значение пяти компонентов как

  scheme    = $2
  authority = $4
  path      = $5
  query     = $7
  fragment  = $9

Двигаясь в противоположном направлении, мы можем воссоздать ссылку URI из своих компонентов с помощью алгоритма Раздела 5.3.

Вы можете использовать это регулярное выражение для ручного анализа URL вручную или использования встроенной функции parse_url, доступной в PHP 4 и 5

Ответ 3

Это зависит от вашего определения. Семантически корректно, разрешает доменное имя и т.д.

Быстрый подход состоял бы в том, чтобы использовать preg_match для проверки URL-адреса относительно хорошего регулярного выражения для проверки правильности его формата. В этом потоке есть несколько хороших примеров. Проверка/регулярное выражение PHP для URL-адреса